Hướng dẫn cấu hình một và nhiều cài đặt trang WordPress với Nginx

4 năm trước

 

Giới thiệu

WordPress là CMS phổ biến nhất (hệ thống quản lý nội dung) được sử dụng trên internet ngày nay. Các trang web WordPress có thể được phục vụ bằng cách sử dụng một máy chủ HTTP như Apache hay NGINX, trong khi Apache là một lựa chọn tuyệt vời để phục vụ cho các trang web, nhiều trang web đã chuyển sang NGINX vì nó có khả năng mở rộng kiến ​​trúc hướng sự kiện, nguồn lực thấp và cung cấp các tập tin thống kê tốt hơn. Trong hướng dẫn này, bạn sẽ học cách cấu hình NGINX cho các loại cài đặt WordPress, bao gồm các cấu hình multisite, viết lại các quy tắc và sử dụng các tệp .conf để áp dụng các cấu hình lặp lại.

Yêu cầu 

Trong bài hướng dẫn này, bạn sẽ cần sudo để cài đặt và edit file. Tôi sẽ mặc định là bạn đã đọc qua hướng dẫn cài đặt ban đầu

Bạn sẽ cần cài đặt MySQL, PHP & NGINX

Lưu ý rằng khối server của bạn sẽ khác nhau và trong bài hướng dẫn này chúng tôi sẽ bắt PHP-FPM dùng một UNIX Socket.

Tối ưu hoá NGINX cơ bản

Điều chỉnh quy trình làm việc và kết nối NGINX

Nhiều người thường khuyên là thiết lập số lượng worker NGINX tương đương số lượng bộ vi xử lí, bạn có thể xác định số lượng bộ xử lí sử dụng:

cat /proc/cpuinfo | grep processor 

Mở file cấu hình NGINX chính:

sudo nano /etc/nginx/nginx.conf

Tăng hoặc giảm số lượng worker phụ thuộc vào thông số kỹ thuật hệ thống:

worker_processes 1;

NGINX hạn chế số lượng kết nối mà worker có thể duy trì, nếu website của bạn có nhiều người truy cập thì bạn có thể muốn tăng số lượng kết nội hạn ché. Trong lý thuyết này thì số lượng kết nối lớn nhất = workers * limit

worker_connections 768;

Kích hoạt Gzip

Tệp có thể được nén bằng Gzip để tăng tốc độ WordPress, kích thước dữ liệu càng nhỏ theo yêu cầu của người dùng thì đáp ứng càng nhanh. Hãy suy nghĩ về tệp CSS và tệp HTML, chúng có nhiều chuỗi tương tự, văn bản lặp lại và không gian trắng. Gzip sử dụng một thuật toán gọi là DEFLATE để loại bỏ các chuỗi lặp lại bằng cách liên kết đến vị trí trước của chuỗi giống hệt nhau và tạo một tệp nhỏ hơn nhiều. Tìm phần Gzip và bật nó: Tệp có thể nén bằng cách sử dụng Gzip để tăng tốc WordPress, hãy kích đúp dữ liệu được yêu cầu bởi người dùng và phản hồi nhanh hơn

gzip on;
gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;

Lưu và thoát

 

Tạo file  NGINX .conf 

Bởi vì bạn có thể muốn lưu trữ nhiều hơn một website WordPress, chúng ta sẽ đi tạo một vài file .conf mà có thể được load từ khối server thay vì viết cấu hình tương tự nhiều lần trên mỗi khối server.

Trong bước tiếp theo, chúng ta sẽ tạo 3 file để giữ cấu hình của chúng ta:

  • common.conf: cấu hình có thể áp dụng bởi tất cả các trang
  • wordpress.conf: cấu hình có thể áp dụng bởi tất cả các trang WordPress 
  • multisite.conf: Cấu hình đặc biệt cho nhiều trang WordPress với thư mục phụ

Chúng ta sẽ đi tạo tất cả các file trong một thư mục được gọi là " global" nhưng trước tiên chúng ta sẽ cần tạo một thư mục vừa được nhắc đến:

sudo mkdir /etc/nginx/global

Tôi sẽ cài đặt  /etc/nginx/global như thư mục hiên tại chỉ để làm cho mọi thứ trở nên dễ dàng hơn

cd /etc/nginx/global

File common.conf 

Hãy tạo file .conf đầu tiên của chúng ta áp dụng cho bất kì loại trang web nào.

sudo nano common.conf

Điều này sẽ mở một file trống, copy cấu hình sau:

# Global configuration file.
# ESSENTIAL : Configure Nginx Listening Port
listen 80;
# ESSENTIAL : Default file to serve. If the first file isn't found, 
index index.php index.html index.htm;
# ESSENTIAL : no favicon logs
location = /favicon.ico {
log_not_found off;
access_log off;
}# ESSENTIAL : robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}# ESSENTIAL : Configure 404 Pages
error_page 404 /404.html;
# ESSENTIAL : Configure 50x Pages
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}# SECURITY : Deny all attempts to access hidden files .abcde
location ~ /\. {
deny all;
}# PERFORMANCE : Set expires headers for static files and turn off logging.
location ~* ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off; log_not_found off; expires 30d;
}

listen 80; xác định cổng kết nối của server.

 index index.php... xác định tệp tin mặc định để phục vụ (WordPress index.php). Nếu tập tin đầu tiên không được tìm thấy, thứ hai sẽ được sử dụng và như vậy. Bạn có thể có các trang web HTML đó là lý do chúng tôi bao gồm index.html & index.htm ;. xác định tệp tin mặc định của máy chủ (WordPress index.php)

location = /robots.txt {allow all;} cho phép truy cập tới robots.txt, nếu bạn muốn chỉ định thư mục khác cho robos.txt thì bạn có thể thêm một bí danh:

location /robots.txt {
alias /var/www/example.com/public/sample_robots.txt;
}

location ~ /\. {deny all;} trong một hệ thống Linux, file ẩn bắt đầu với "." truy cập tới những file bị ẩn như là .htacces nên bị chặn vì lí do bảo mật.

location ~* ^.+\.(js|css|swf... hạn tiêu đề bảo trình duyệt liệu rằng họ nên yêu cầu một file cụ thể từ máy chủ hay họ có nên lấy nó từ bộ nhớ cache của trình duyệt hay không. Với hết hạn 30d, chúng tôi sẽ cho trình duyệt lưu trữ các tệp tĩnh như hình ảnh trong 30 ngày

Save and exit. Lưu và thoát 

File wordpress.conf 

Hãy tạo một file .conf áp dụng cho tất cả trang WordPress:

sudo nano wordpress.conf

Nó sẽ mở một file trống, copy cấu hình sau:

# WORDPRESS : Rewrite rules, sends everything through index.php and keeps the appended query string intact
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}# SECURITY : Deny all attempts to access PHP Files in the uploads directory
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}# REQUIREMENTS : Enable PHP Support
location ~ \.php$ {
# SECURITY : Zero day Exploit Protection
try_files $uri =404;
# ENABLE : Enable PHP, listen fpm sock
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}# PLUGINS : Enable Rewrite Rules for Yoast SEO SiteMap
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
#Yeah! you did it.

try_files $uri $uri/ /index.php?q=$uri&$args quy tắc viết lại được yêu cầu để cho phép bạn chọn cấu trúc permalink tuỳ chỉnh trên WordPress.

location ~* /(?:uploads|files)/.*\.php$ {deny all;} nó sẽ chặn code độc hại để nó không được upload và xử lí từ thư mục media WordPress.

location ~ \.php$ {...} vì WordPress là một trang php, chúng ta cần bảo NGINX cách để chuyển tập lệnh php của chúng ta đến PHP5.

try_files $uri =404; đây là một quy tắc bảo mật, bạn chỉ muốn phục vụ một file php đã được xác định hoặc là hiển thị lỗi 404 error.

Các quy tắc khác: Bạn có thể muốn thêm các quy tắc NGINX khác, ví dụ: nếu bạn sử dụng các Plugin WP tương tự yêu cầu các quy tắc tùy chỉnh trên tất cả các cài đặt của bạn như tôi, bạn có thể thêm các quy tắc khác vào tệp .conf này. Ví dụ: tôi sử dụng SEO Yoast trên tất cả các trang web của mình do đó tôi thêm các quy tắc viết lại yêu cầu ở đây, theo cách này tôi không phải sao chép cùng một quy tắc viết lại cho mỗi khối máy chủ

File multisite.conf 

Không giống với 1 trang WordPress cái mà có thể hoạt động với những permalink "ugly" và cho nên không cần viết lại bất cứ URL nào, cài đặt MultiSite yêu cầu các quy tắc viết lại tuỳ chỉnh để định dạng các URL cho trang phụ của chúng ta. Hãy tạo một file .conf có thể áp dụng với cài đặt Multisite WordPess:

sudo nano multisite.conf

Bước này sẽ mở một file trống, copy quy tắc viết lại được yêu cầu:

# Rewrite rules for WordPress Multi-site.
if (!-e $request_filename){rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}

Lưu và thoát

Lưu ý nhỏ 

Thư mục đang hoạt độnh cuả chúng ta là  /etc/nginx/global, nếu bạn muốn thay đổi thì bạn có thể gõ:

cd /desired_directory
 

Tạo khối server 

Đã đến lúc tạo khối server đầu tiên. Bởi vì chúng ta đã có mọi thư được cấu hình trong file .conf nên không cần tạo một bản sao file khối server. Bây giờ hãy vô hiệu hoá khối server mặc định:

sudo rm /etc/nginx/sites-enabled/default

Và tạo một file khối server:

sudo nano /etc/nginx/sites-available/demo

Nó sẽ mở một file trống, copy cấu hình sau tuỳ theo bạn muốn đạt cái gì:

Cài đặt WordPress đơn giản

Thử tượng tượng bạn muốn cấu hình một trang WordPress với miền www.demo.com. Đầu tiên chúng ta sẽ phải tạo một khối server server {...} nơi bạn sẽ đặt các quy tắc. Chúng ta phải chỉ định khối server nào được dùng cho một URL, bao gồm common.conf & wordpress.conf và cuối cùng chúng ta sẽ thông báo NGINX vị trí cài đặt của WordPress trong server của chúng ta.

server {
# URL: Correct way to redirect URL's
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}

Nhớ thay đổi dữ liệu sau để phù hợp với như cầu của bạn:

  • server_name: Determine which server block is used for a given URL.
  • root: The path where your site is stored.
  • access log & error log: Set the paths for your logs

Bạn có thể thấy rằng có hai khối máy chủ, đó là vì www.demo.com & demo.com là các URL khác nhau. Bạn có thể muốn đảm bảo rằng Google, Bing, người dùng ... chọn URL bạn muốn, trong trường hợp này tôi muốn trang web của mình là www.demo.com vì vậy tôi đã định cấu hình permanent redirect từ demo.com sang www .demo.com. Cũng có thể chỉ định nhiều tên miền:

server {
# URL: Correct way to redirect URL's
server_name demo.com sub.demo.com example.com;

Multisite với các thư mục phụ 

Nếu bạn muốn cài đặt multisite với các thư mục phụ thì bạn sẽ cần có các quy tắc viết lại được lưu trong multisite.conf:

# URL: add a permanent redirect if required.
server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}

Multisite với miền phụ

Nếu bạn muốn cài đặt multisite với miền phụ, bạn sẽ cần cấu hình cho khối server để làm việc với miền với kí tự đại diện:

server {
server_name *.demo2.com;
root /home/demouser/sitedir2;
access_log /var/log/nginx/demo2.com.access.log;
error_log /var/log/nginx/demo2.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}

HTML và các website khác

Nếu bạn muốn lưu trữ websitee html đơn giản hay những webapp khác thì bạn sẽ cần chỉ định các quy tắc tuỳ chỉnh hoặc tạo nhiều file .conf hơn và cho chúng vào khối server:

# URL: add a permanent redirect if required.
server {
server_name www.demo3.com;
root /home/demouser/sitedir3;
access_log /var/log/nginx/demo3.com.access.log;
error_log /var/log/nginx/demo3.com.error.log;
# custom rules
}

Lưu và thoát.

 

Kích hoạt file khối server

Bước cuối cùng là kích hoạt máy chủ bằng cách tạo một link kí tự giữa thư mục trang khả dụng với thư mục kích hoạt trang :

sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo

Chúng ta có nhiều thay đổi của cấu hình. Load lại NGINX và ẩn các thay đổi này.

sudo service nginx reload; 
 

Lưu ý cuối cùng 

 Để tạo thêm các máy chủ ảo, có chỉ có thể làm lại quá trình trên. Bạn cũng nên cẩn thận trong việc cài đặt một root tài liệu với tên miền phù hợp mỗi lần.Bạn cũng có thể  kết hợp nhiều khối server chỉ trong trong file 

server {
server_name demo.com;
rewrite ^/(.*)$ http://www.demo.com/$1 permanent;
}server {
server_name www.demo.com;
root /home/demouser/sitedir;
access_log /var/log/nginx/www.demo.com.access.log;
error_log /var/log/nginx/www.demo.com.error.log;
include global/common.conf;
include global/wordpress.conf;
}server {
server_name www.demo1.com;
root /home/demouser/sitedir1;
access_log /var/log/nginx/www.demo1.com.access.log;
error_log /var/log/nginx/www.demo1.com.error.log;
include global/common.conf;
include global/wordpress.conf;
include global/multisite.conf;
}# More server blocks....