Nginx

虽然LAMP栈(Linux + Apache + MySQL + PHP)在支持WordPress方面非常流行,但也可以使用Nginx。WordPress支持Nginx,一些大型的WordPress网站,如WordPress.com,都是由Nginx支持的。

当谈到Nginx时,知道有多种实现Nginx的方法是很重要的。它可以设置为Apache前面的反向代理,这是一个非常强大的设置,允许你使用Apache的所有特性和功能,同时受益于Nginx的速度。大多数使用Nginx作为服务器的网站(基于从HTTP响应头中收集的数据),实际上是使用Nginx作为反向代理运行的Apache。(HTTP响应头显示“Nginx”是由反向代理报告的,而不是服务器本身。)

本指南是指独立的Nginx安装程序,在其中它被用作主要服务器而不是Apache。需要注意的是,Nginx并不是Apache的完全替代品。在你继续之前,有几个影响WordPress实现的关键差异需要你注意:

  • Nginx没有像Apache的。htaccess或IIS的web那样的目录级配置文件。配置文件。所有配置都必须由管理员在服务器级完成WordPress不能修改配置,就像它可以与Apache或IIS。
  • 运行Nginx时,漂亮的permallinks功能略有不同。
  • 由于Nginx没有。htaccess类型的功能,WordPress也不能自动为你修改服务器配置,所以它不能为你生成重写规则。
  • 不需要修改您的安装,“index.php”将被添加到您的Permalinks。(有一些方法可以通过插件(见下文)和/或添加自定义代码到子主题的functi雷竞技ons.php来缓解这个问题。)
  • 但是,如果你确实想拥有一些(有限的).htaccess功能,在技术上可以通过安装PHP的PECL扩展.(然而,这并不是一个完美的解决方案,所以在使用现场之前一定要进行彻底的测试和调试。)

本指南是不打算覆盖这篇文章假设你已经安装了Nginx,并且对如何使用和调试有基本的了解。

通用和多站点支持

要让WordPress和Nginx一起工作,你必须配置后端php-cgi。可用的选项是' fastcgi '或' php-fpm '。这里使用PHP -fpm,因为它包含在PHP 5.3+中,所以安装它很简单。

Nginx的配置被分成了5个不同的文件,并且被大量注释以使每个选项更容易理解。的作者也尽了最大努力尝试遵循nginx配置的“最佳实践”。

顶部↑

主要(通用)启动文件

这相当于/etc/nginx/nginx.conf(或者/etc/nginx/conf/nginx.conf,如果你使用Arch Linux)。

#通用启动文件。用户{user}{集团};#通常等于你的cpu数量。执行命令“grep processor /proc/cpuinfo | wc -l”找到worker_processes auto;worker_cpu_affinity汽车;error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;#使日志中不包含关于无法bind()的消息。#守护进程;事件{worker_connections 1024; } http { # rewrite_log on; include mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; # tcp_nopush on; keepalive_timeout 3; # tcp_nodelay on; # gzip on; #php max upload limit cannot be larger than this client_max_body_size 13m; index index.php index.html index.htm; # Upstream to abstract backend connection(s) for PHP. upstream php { #this should match value of "listen" directive in php-fpm pool server unix:/tmp/php-fpm.sock; # server 127.0.0.1:9000; } include sites-enabled/*; }

这与标准的nginx.conf文件有一点不同。这个配置遵循Ubuntu/Debian声明启用站点的方法,以获得最大的灵活性——使用' sites-available '来存储配置,然后从' sites-enabled '链接到配置文件。

顶部↑

每个站点配置

#重定向到主网站。我们使用一个单独的server语句,而不是if语句——参见http://wiki.nginx.org/IfIsEvil server {server_name _;返回302美元方案:/ / example.com request_uri美元;}服务器{server_name example.com;根/var/www/example.com;指数index . php;包括全球/ restrictions.conf;#其他规则请点击这里。只包含下面的一个文件。包括全球/ wordpress.conf; # include global/wordpress-ms-subdir.conf; # include global/wordpress-ms-subdomain.conf; }

将配置的各个部分分割成多个文件允许重复使用相同的逻辑。一个' global '子目录被用来添加额外的规则(可以是/etc/nginx/conf/global/或/etc/nginx/global/,这取决于你的nginx安装是如何设置的)。

顶部↑

全球限制文件

#全局限制配置文件。#设计为包含在任何服务器{}块。Location = /favicon.ico {log_not_found off;access_log;} location = /robots.txt{允许所有;log_not_found;access_log;} #拒绝所有访问隐藏文件的尝试,例如。htaccess, .htpasswd, . ds_store (Mac)。#继续记录请求以稍后解析(或传递给防火墙实用程序,如fail2ban)的位置~ /\{否认; } # Deny access to any files with a .php extension in the uploads directory # Works in sub-directory installs and also in multisite network # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~* /(?:uploads|files)/.*\.php$ { deny all; }

顶部↑

一般WordPress规则

对于单站点安装,下面是' global/wordpress.conf '文件:

# WordPress单站点规则。#设计为包含在任何服务器{}块。/tmp/php-cgi.socket;服务器127.0.0.1:9000;}服务器{##您的网站名称在这里。server_name domain.tld;你唯一的路径参考。根/var/www/wordpress;##这应该在你的http块,如果它是,这里不需要它。指数index . php; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location / { # This is cool because no php is touched for static content. # include the "?$args" part so non-default permalinks doesn't break when using query string try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }

这是Nginx最新的例子:https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

顶部↑

WordPress多站点子目录规则

对于多站点子目录安装,这里是' global/wordpress.conf '文件:

WordPress多站点子目录规则。#设计为包含在任何服务器{}块。地图uri blogname美元{~ ^ (? P /[^ /] + /) /文件(. *)blogpath美元;}映射$blogname $blogid{默认-999;#include /var/www/wordpress/wp-cont雷竞技ent/plugins/nginx-helper/map.conf;}服务器{server_name example.com;根/var/www/example.com/htdocs;指数index . php;位置  ~ ^(/[^/]+/)? 文件/ (+){try_files / wp-content /博客。dir /看/文件/ 2美元/ wp-includes / ms-files.php吗?文件= 2美元;access_log; log_not_found off; expires max; } #avoid php readfile() location ^~ /blogs.dir { internal; alias /var/www/example.com/htdocs/wp-content/blogs.dir ; access_log off; log_not_found off; expires max; } if (!-e $request_filename) { rewrite /wp-admin$ $scheme://$host$request_uri/ permanent; rewrite ^(/[^/]+)?(/wp-.*) $2 last; rewrite ^(/[^/]+)?(/.*\.php) $2 last; } location / { try_files $uri $uri/ /index.php?$args ; } location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass php; } #add some rules for static content expiry-headers here }

NGINX提供了2个特别的指令:x - accelerate - redirect和map。使用这两个指令,可以消除在WordPress多站点网络上服务静态文件的性能影响。

顶部↑

WordPress多站点子域规则

映射$http_host $blogid{默认-999;#include /var/www/wordpress/wp-cont雷竞技ent/plugins/nginx-helper/map.conf;}服务器{server_name example.com *.example.com;根/var/www/example.com/htdocs;指数index . php;Location / {try_files $uri $uri/ /index.php?args美元;} location ~ \.php$ {try_files $uri =404;包括fastcgi_params;fastcgi_pass php;} #WPMU文件位置~ ^/ Files /(.*)$ {try_files /wp-content/blogs。dir /看/ uri / wp-includes / ms-files.php美元吗?文件= 1美元; access_log off; log_not_found off; expires max; } #WPMU x-sendfile to avoid php readfile() location ^~ /blogs.dir { internal; alias /var/www/example.com/htdocs/wp-content/blogs.dir; access_log off; log_not_found off; expires max; } #add some rules for static content expiry-headers here }

裁判:https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

顶部↑

HTTPS的Nginx

在Nginx中启用HTTPS是相对简单的。

server{#监听IPv4和IPv6在443上,并启用HTTPS和HTTP/2支持。# HTTP/2在nginx 1.9.5或更高版本中可用。监听*:443 SSL http2;Listen [::]:443 SSL http2;#表示SSL密钥文件的位置。ssl_certificate /电脑/ www / ssl / ssl.crt;ssl_certificate_key /电脑/ www / ssl / ssl.key;ssl_dhparam /电脑/ www /主/ ssl / dhparam.pem;#表示服务器名称server_name example.com *.example.com;#启用hst。 This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; # Set caches, protocols, and accepted ciphers. This config will merit an A+ SSL Labs score as of Sept 2015. ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5'; }

Mozilla提供了一个优秀的SSL配置生成工具

顶部↑

WP超级缓存规则

# WP超级缓存规则。#设计包含从一个'wordpress-ms-…的配置文件。设置cache_uri request_uri美元;# POST请求和url与查询字符串应该总是去PHP如果($request_method = POST){设置$cache_uri 'null cache';} if ($query_string != ""){设置$cache_uri 'null cache';} #不缓存包含以下片段的uri 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)"){设置$cache_uri 'null cache';} #如果($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in"){设置$cache_uri 'null cache';} #开始移动浏览器#移动浏览器部分服务他们的非缓存版本。大多数现代wordpress主题,包括2011,默认评论是响应的。# if ($http_x_wap_profile) {# set $cache_uri 'null cache'; #} #if ($http_profile) { # set $cache_uri 'null cache'; #} #if ($http_user_agent ~* (2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800)) { # set $cache_uri 'null cache'; #} #if ($http_user_agent ~* (w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-)) { # set $cache_uri 'null cache'; #} #END MOBILE # Use cached or actual file if they exists, otherwise pass request to WordPress location / { try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args ; }

实验修改:

如果您使用的是HTTPS, WP超级缓存的最新开发版本可能会使用不同的目录结构来区分HTTP和HTTPS。Try_files行可能如下所示:

Location / {try_files /wp-content/cache/supercache/$http_host/$cache_uri/index-http .html $uri $uri/ /index.php?args美元;}

顶部↑

W3总缓存规则

根据WordPress配置的不同,W3 Total Cache使用不同的目录结构进行基于磁盘的缓存存储。

缓存验证检查仍然很常见,如下所示:

#W3总缓存检查设置$cache_uri# POST请求和url与查询字符串应该总是去PHP如果($request_method = POST){设置$cache_uri 'null cache';} if ($query_string != ""){设置$cache_uri 'null cache';} #不缓存包含以下片段的uri 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)"){设置$cache_uri 'null cache';} #如果($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in"){设置$cache_uri 'null cache';从上面的WP SUPER CACHE中添加移动规则#从下面添加一个代码块…

对于普通WordPress(没有Multisite)
使用后:

#使用缓存或实际文件,如果它们存在,否则将请求传递到WordPress位置/ {try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?args美元;}

FOR带有子目录的多站点
使用以下:

if ($request_uri ~* "^/([_0-9a-zA-Z-]+)/。*"){设置$blog $1;}设置$blog "${blog}.";$blog = "blog."){设置$blog "";} #如果存在缓存或实际文件,请使用缓存或实际文件,否则将请求传递到WordPress位置/ {try_files /wp-content/w3tc-$blog$host/pgcache$cache_uri/_index.html $uri $uri/ /index.php?args美元;}

对于多站点与子域/域映射
使用后:

Location / {try_files /wp-content/w3tc-$host/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args;}

笔记

  • Nginx可以自动处理gzip和浏览器缓存,所以最好把这部分留给Nginx。
  • W3总缓存最小化规则将在上述配置下工作,没有任何问题。

顶部↑

Nginx fastcgi_cache

Nginx可以在自己的端进行缓存,以减少服务器的负载。当你想使用Nginx内置的fastcgi_cache时,你最好用它来编译Nginxfastcgi_cache_purge模块。它将帮助nginx在页面被编辑时清除缓存。在WordPress端,你需要安装一个插件,比如Nginx助手利用fastcgi_cache_purge特性。

配置如下图所示:

在http{…}块中定义一个Nginx缓存区,在服务器{…}块的外面

fastcgi_cache_path /var/run/nginx-cache level =1:2 key_zone = 500 inactive=60mfastcgi_cache_key“计划request_method主机美元request_uri美元”;Fastcgi_cache_use_stale错误超时invalid_header http_500;

对于WordPress站点配置,在服务器{..}block add a cache check block as follow

#fastcgi_cache start set $no_cache 0;# POST请求和url与查询字符串应该总是去PHP如果($request_method = POST){设置$no_cache 1;} if ($query_string != ""){设置$no_cache 1;} #不缓存包含以下片段的uri 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 $no_cache 1;} #如果($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {set $no_cache 1;}

然后修改PHP处理块

只需将它添加到下面的php块。注意,线fastcgi_cache_valid 200 60米;这告诉nginx只缓存200个响应(普通页面),这意味着重定向不缓存。这对于多语言网站很重要,如果没有实现的话,nginx会缓存一种语言的主url,而不是根据用户的语言重定向到他们各自的内容。

fastcgi_cache_bypass no_cache美元;fastcgi_no_cache no_cache美元;fastcgi_cache WORDPRESS;fastcgi_cache_valid 200 60米;

使它变成这样

位置~ \(^ /)。php (/ | $) {fastcgi_split_path_info ^(+ ? \。php)(/ . *)美元;如果(!-f $document_root$fastcgi_script_name){返回404;这是一个健壮的路径信息安全问题的解决方案,与“cgi。Fix_pathinfo = 1"在/etc/php.ini(默认)包含fastcgi.conf;fastcgi_index index . php。# fastcgi_intercept_errors;fastcgi_pass php;fastcgi_cache_bypass no_cache美元;fastcgi_no_cache no_cache美元;fastcgi_cache WORDPRESS; fastcgi_cache_valid 200 60m; }

最后添加一个位置用于条件清除

location ~ /purge(/.*){#取消下面两行注释,只允许从web服务器清除#allow 127.0.0.1;#否认;fastcgi_cache_purge WORDPRESS“计划request_method主机美元1美元”;}

如果你得到一个未知指令" fastcgi_cache_purge "错误检查你的Nginx安装是否有fastcgi_cache_purge模块。

顶部↑

更好的性能静态文件在多站点

默认情况下,在Multisite设置中,一个静态文件请求将php带入图片中。ms-files.php文件。使用Nginx可以获得更好的性能地图{…}指令。

在Nginx配置你的网站,如上服务器{…}块,增加如下段落:

映射$http_host $blogid{默认0;example.com 1;site1.example.com 2;site1.com 2;}

它只是站点名称和博客id的列表。您可以使用Nginx助手获取这样一个站点-名称/博客-id对列表。这个插件也会生成一个map.conf你可以像这样直接包含在map{}部分的文件:

映射$http_host $blogid{默认0;包括/道路/ / map.conf;}

在创建一个地图{…}section中,你只需要在你的Nginx配置中再做一个更改/文件/将首先使用nginx处理地图{…}

Location ~ ^/files/(.*)$ {try_files /wp-content/blogs。dir /看/ uri / wp-includes / ms-files.php美元吗?文件= 1美元;access_log;log_not_found;马克斯到期;}

顶部↑

笔记

  • 每当一个新的站点被创建,删除,或者一个额外的域被映射到一个现有的站点,Nginx助手会自动更新map.conf文件,但你仍然需要手动重新加载Nginx配置。你可以在以后的任何时候做。到那时,只有新站点的文件才会使用php-fpm。
  • 此方法不生成任何符号链接。因此,不存在跟随符号链接的意外删除或备份脚本的问题。
  • 对于大型网络,这将很好地扩大,因为将有一个单独的map.conf文件。

顶部↑

笔记

最后有几个重要的注意事项:整个设置假定站点的根是博客,并且所有要引用的文件都驻留在主机上。如果您将博客放在诸如/blog这样的子目录中,那么必须修改规则。也许有人可以利用这些规则,例如,使用a:

设置$ wp_subdir " /博客”;

指令在主' server '块中,并让它自动应用到通用的WP规则。

顶部↑

警告

  • 中出现一个错字全球限制文件可以创建漏洞。要测试“uploads”目录是否真正受到保护,创建一个包含一些内容的PHP文件(例如:),将其上传到“uploads”目录(或其子目录之一),然后尝试从浏览器访问(执行)它。

顶部↑

资源

顶部↑

参考

顶部↑

顶部↑

脚本和工具

  • WordPress Nginx脚本安装CentminMod可用于CentOS系统。

顶部↑

确保Nginx

这篇文章有用吗?如何改进?