Trang chủ WordpressHướng dẫn Wordpress Tổng hợp các cấu hình NGINX cho WordPress

Tổng hợp các cấu hình NGINX cho WordPress

bởi Thạch Phạm
10 bình luận 5265 views
Khuyến mãi hosting

Hiện nay trên ThachPham.com có khá nhiều serie liên quan đến NGINX và WordPress mà mình viết rải rác, các serie đó thường đều rất dài nhưng thực ra nó có chung một phần là cấu hình NGINX để chạy website WordPress. Như vậy sắp tới mình sẽ viết lại các serie đó theo hướng dễ hiểu hơn và không quá đi sâu vào WordPress, nên mình sẽ đăng tổng hợp các cấu hình NGINX dành cho WordPress trong bài viết này để mọi người có thể dễ dàng tìm kiếm.

Nếu bạn dùng EasyEngine thì không cần chèn thêm cái gì cả.

1. Cấu hình permalink cho NGINX

Có rất nhiều bạn hỏi là tại sao cài NGINX vào thì website luôn bị lỗi 404 khi xem bài viết có chỉnh permalinks, đơn giản là đối với WordPress, bạn phải sửa lại dòng location / {...} trong tập tin cấu hình NGINX của domain bạn đang sử dụng.

location / {
	try_files $uri $uri/ /index.php?$args;
}

2. Bảo mật các tập tin và thư mục nhạy cảm

# Hạn chế đăng nhâp
 location = /wp-login.php {
 allow ĐIỀN IP MÁY TÍNH CỦA BẠN VÀO ĐÂY;
 deny all;
 
 try_files $uri =404;
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 include /etc/nginx/fastcgi_params;
 fastcgi_connect_timeout 180s;
 fastcgi_send_timeout 180s;
 fastcgi_read_timeout 180s;
 fastcgi_intercept_errors on;
 fastcgi_max_temp_file_size 0;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_index index.php;
 }

# Chặn truy cập PHP trong thư mục uploads
location /wp-content/uploads/ {
   location ~ \.php$ {
      #Prevent Direct Access Of PHP Files From Web Browsers
      deny all;
  }
}

3. Cấu hình cho sitemap củaYoast SEO

# Yoast sitemap
location ~ ([^/]*)sitemap(.*)\.x(m|s)l$ {
    rewrite ^/sitemap\.xml$ /sitemap_index.xml permanent;
    rewrite ^/([a-z]+)?-?sitemap\.xsl$ /index.php?xsl=$1 last;
    # Rules for yoast sitemap with wp|wpsubdir|wpsubdomain
    rewrite ^.*/sitemap_index\.xml$ /index.php?sitemap=1 last;
    rewrite ^.*/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
    # Following lines are options. Needed for WordPress seo addons
    rewrite ^/news_sitemap\.xml$ /index.php?sitemap=wpseo_news last;
    rewrite ^/locations\.kml$ /index.php?sitemap=wpseo_local_kml last;
    rewrite ^/geo_sitemap\.xml$ /index.php?sitemap=wpseo_local last;
    rewrite ^/video-sitemap\.xsl$ /index.php?xsl=video last;
access_log off;
}

5. Cấu hình cho WP Super Cache

# WP Super Cache
 set $cache_uri $request_uri;

 # POST requests and urls with a query string should always go to PHP
 if ($request_method = POST) {
   set $cache_uri 'null cache';
 } 
 if ($query_string != "") {
  set $cache_uri 'null cache';
 } 

 # Don't cache uris containing the following segments
 if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
  set $cache_uri 'null cache';
 } 

 # Don't use the cache for logged in users or recent commenters
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
 set $cache_uri 'null cache';
 }

Sau đó sửa location / {...} thành như sau:

location / {
  try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php ;
}

6. Cấu hình cho W3 Total Cache

# W3 Total Cache
set $cache_uri $request_uri;
# POST requests and URL with a query string should always go to php
if ($request_method = POST) {
  set $cache_uri 'null cache';
}
if ($query_string != "") {
  set $cache_uri 'null cache';
}
# Don't cache URL containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
  set $cache_uri 'null cache';
}
# Don't use the cache for logged in users or recent commenter
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
  set $cache_uri 'null cache';
}

Sau đó sửa location / {...} thành:

# Use cached or actual file if they exists, Otherwise pass request to WordPress
location / {
  try_files /wp-content/cache/page_enhanced/${host}${cache_uri}_index.html $uri $uri/ /index.php?$args;
}

7. Tạo thêm tập tin nginx.conf cho website

Hiện nay các plugin WordPress nếu có hỗ trợ NGINX thì có thể sẽ tự chèn các cấu hình NGINX vào tập tin nginx.conf trong thư mục gốc của website. Do vậy, bạn nên tạo sẵn một tập tin nginx.conf trong thư mục public của website và tiến hành nhúng nó vào tập tin cấu hình NGINX của domain như sau:

include /home/domain.com/public_html/nginx.conf;

Nhớ sửa lại đường dẫn cho chính xác.

Nếu bạn cần thêm cấu hình nào cho NGINX thông dụng trong WordPress thì hãy comment để mình bổ sung nhé.

10 bình luận

Có thể bạn quan tâm

10 bình luận

Tân 27/04/2017 - 5:01 Chiều

Cho mình hỏi bước này 2. Bảo mật các tập tin và thư mục nhạy cảm sửa ở file nào thế bạn.
Mình làm bài này theo toàn bộ hướng dẫn LEMP cho VPS [Phần 2] – Thêm VirtualHost (thêm domain) cho NGINX

Reply
Thạch Phạm 29/04/2017 - 5:02 Sáng

Bạn chèn đoạn đó vào trong tập tin cấu hình domain của bạn trên NGINX nhé. Chèn dưới phần location / {} ấy.

Reply
Albert 13/11/2016 - 6:23 Chiều

Khi em làm theo hướng dẫn nhưng khi mở bài viết vẫn lỗi 404. E làm như đầu bài vẫn lỗi. Em cài trong /home/nginx/abc.net/public_html/

Reply
Hải 18/09/2016 - 10:13 Sáng

ví dụ muốn chặn http://domain.com/wp-admin/plugins.php khi vào đó phải nhập user và pass giống của bên .htaccess thì sao nhỉ? giúp mình với.

Reply
Truong 16/09/2016 - 6:50 Chiều

nếu mình thêm đoạn code sau vàolocation = /wp-login.php {
limit_req zone=one burst=1 nodelay;
include fastcgi_params;
fastcgi_pass php;
}

Lúc restart nginx chứ báo lỗi dòng ” fastcgi_pass php;”. Như vậy mình khắc phục sao bạn

Reply
Thạch Phạm 17/09/2016 - 1:28 Sáng

À nếu vậy thì hình như chỉ có server dùng EasyEngine mới dùng được đoạn đó, bạn thử thay fastcgi_pass thành fastcgi_pass 127.0.0.1:9000; nhé.

Reply
Xuan Hong 08/08/2016 - 8:21 Chiều

Mình muốn khi vào website với đường dẫn ko có tham số thì chạy phai index.html, còn có tham số thì chạy file index.php?q=$1.
Ví dụ :
abc.com => abc.com/index.html
abc.com/admin => abc.com/index.php?q=$1 (với tham số của admin)
(Bên apache thì chỉ cần cho thứ tự ưu tiên của index.html lên trước là xong, bên nginx mò hoài ko ra)

Reply
Khải Trần 28/06/2016 - 5:36 Chiều

Hi anh Thạch!
Em làm theo các bước hướng dẫn và chạy wp rất ok,nhưng khi em cài wp vào thư mục con,ví dụ thachpham.com/wordpress (em cài theo dạng public_html/wordpress ) thì khi đổi permalink nó báo lỗi “No input file specified”.
Có cách nào xử lý để nó hoạt động bình thường ko ạ? Em đoán cái rule try_files $uri $uri/ /index.php?$args; chỉ đúng khi mình cài wordpress trực tiếp trong public_html.
Ý của em là trong thư mục public_html em sẽ cài nhiều site wordpress khác nhau dạng thachpham.com/site1,thachpham.com/site2,…vvv
Thanks anh vì series cực hay!

Reply
Thạch Phạm 29/06/2016 - 8:41 Sáng

Bạn sửa lại rules NGINX như thế này nhé:

location /wp/ {
    index index.php;
    try_files $uri $uri/ /wp/index.php?$args;
}
Reply

Để lại một bình luận

* Khi bình luận, bạn đồng ý rằng thông tin bạn nhập vào bao gồm tên, email và địa chỉ IP sẽ được lưu giữ tại website.