如何使用Nginx配置单个和多个WordPress站点设置
介绍
WordPress 是当今互联网上最流行的 CMS(内容管理系统)。 WordPress 站点可以使用 Apache 或 NGINX 等 HTTP 服务器提供服务,而 Apache 是服务网站的绝佳选择,许多站点已迁移到 NGINX,因为它具有可扩展的事件驱动架构、低资源和更好的静态文件交付。 在本教程中,您将学习如何为各种类型的 WordPress 安装配置 NGINX,包括多站点配置、重写规则以及使用 .conf 文件来应用重复配置。
要求
在本指南中,您将需要 sudo 来安装和编辑文件。 我假设您已经完成了初始服务器设置。
您将需要安装 MySQL、PHP 和 NGINX。 您可以按照这些指南在 Ubuntu 或 Debian 上安装 LEMP。
请注意,我们的服务器块将有所不同,并且在本教程中,我们使 PHP-FPM 使用 UNIX 套接字。
基本 NGINX 优化
调整 NGINX 工作进程和连接
通常建议将 NGINX 工作程序的数量设置为等于处理器的数量,您可以使用以下方法确定处理器的数量:
cat /proc/cpuinfo | grep processor
打开主要的 NGINX 配置文件:
sudo nano /etc/nginx/nginx.conf
根据您的系统规格增加或减少工作人员的数量:
worker_processes 1;
NGINX 限制了工作人员一次可以维护的连接数,如果您的网站有很多访问者,您可能希望增加连接数限制。 理论上最大连接数=工人*限制。
worker_connections 768;
启用 Gzip
可以使用 Gzip 压缩文件来加速 WordPress,用户请求的数据量越小,响应速度越快。 想想 CSS 文件和 HTML 文件,它们有许多相似的字符串、重复的文本和空格。 Gzip 使用一种称为 DEFLATE 的算法,该算法通过链接到相同字符串的先前位置来删除重复的字符串,并创建一个小得多的文件。 找到 Gzip 部分并启用它:
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;
保存并退出。
创建 NGINX .conf 文件
由于您可能托管多个 WordPress 网站,我们将创建一些可以从服务器块加载的 .conf 文件,而不是在每个服务器块上多次编写相同的配置。
在接下来的步骤中,我们将创建 3 个文件来保存我们的配置:
- common.conf:适用于所有站点的配置。
- wordpress.conf:适用于所有 WordPress 站点的配置。
- multisite.conf:带有子目录的 WordPress 多站点的特殊配置。
我们将在一个名为“global”的目录中创建所有文件,但首先我们需要创建上述目录:
sudo mkdir /etc/nginx/global
我将 /etc/nginx/global 设置为当前目录只是为了让事情变得更容易。
cd /etc/nginx/global
common.conf 文件
让我们创建适用于任何类型网站的第一个 .conf 文件。
sudo nano common.conf
这将打开一个空文件,复制以下配置:
# 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;
指定服务器的监听端口。
index index.php...
指定要提供的默认文件 (WordPress index.php)。 如果未找到第一个文件,则使用第二个文件,依此类推。 您可能有 HTML 网站,这就是我们包含 index.html 和 index.htm; 的原因。
location = /robots.txt {allow all;}
允许访问 robots.txt,如果你想为 robots.txt 指定另一个目录,你可以添加一个别名:
location /robots.txt { alias /var/www/example.com/public/sample_robots.txt; }
location ~ /\. {deny all;}
Linux 操作系统中的隐藏文件以“.”开头,出于安全原因,应阻止访问某些隐藏文件,例如 .htaccess。
location ~* ^.+\.(js|css|swf...
expires headers 告诉浏览器是否应该从服务器请求特定文件,或者是否应该从浏览器的缓存中获取它。 使用 expires 30d 我们告诉浏览器将静态文件(例如图片)存储 30 天。
保存并退出。
wordpress.conf 文件
让我们创建一个适用于所有 WordPress 网站的 .conf 文件:
sudo nano wordpress.conf
这将打开一个空文件,复制以下配置:
# 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
重写规则允许您在 WordPress 上选择自定义永久链接结构。
location ~* /(?:uploads|files)/.*\.php$ {deny all;}
这将防止恶意代码从 WordPress 媒体目录上传和执行。
location ~ \.php$ {...}
因为 WordPress 是一个 php 站点,我们需要告诉 NGINX 如何将我们的 php 脚本传递给 PHP5。
try_files $uri =404;
这是一个安全规则,您只想提供一个确定的 php 文件或转到 404 错误。
更多规则:您可能想要添加更多 NGINX 规则,例如,如果您使用与我一样在所有安装中需要自定义规则的相同 WP 插件,您可以在此 .conf 文件中添加更多规则,例如 我在所有网站上都使用 Yoast SEO,因此我在这里添加了所需的重写规则,这样我就不必为每个服务器块复制相同的重写规则。
多站点.conf 文件
与单站点 WordPress 不同,它可以使用“丑陋”的永久链接,因此不需要任何 URL 重写,MultiSite 安装需要自定义重写规则来格式化您的子站点的 URL。 让我们创建一个适用于多站点 WordPress 安装的 .conf 文件:
sudo nano multisite.conf
这将打开一个空文件,复制所需的重写规则:
# 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; }
保存并退出。
小笔记
我们当前的工作目录是/etc/nginx/global,如果你想改变它,你可以输入:
cd /desired_directory
创建服务器块
是时候创建我们的第一个服务器块了。 由于我们已经在 .conf 文件中配置了所有内容,因此无需复制默认服务器块文件。 让我们禁用默认服务器块:
sudo rm /etc/nginx/sites-enabled/default
并创建一个服务器块文件:
sudo nano /etc/nginx/sites-available/demo
这将打开一个空文件,根据您要实现的目标复制以下配置:
简单的 WordPress 安装
想象一下,你想用这个域 www.demo.com 配置一个 WordPress 站点。 首先,我们必须创建一个服务器块 server {...}
,我们将在其中放置我们的规则。 我们必须指定哪个服务器块用于给定的 URL,包括 common.conf & wordpress.conf 最后,我们将告诉 NGINX 在我们的服务器中安装 WordPress 的位置。
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; }
请记住更改以下数据以满足您的需求:
- server_name:确定哪个服务器块用于给定的 URL。
- root:您的站点存储路径。
- 访问日志和错误日志 :设置日志的路径
你可以看到有两个服务器块,那是因为 www.demo.com & 演示网站是不同的网址。 您可能想确保 Google、Bing、用户...等选择您想要的 URL,在这种情况下,我希望我的网站是 www.demo.com 所以我已经配置了 永久将 从 demo.com 重定向到 www.demo.com。 也可以指定多个域:
server { # URL: Correct way to redirect URL's server_name demo.com sub.demo.com example.com;
带有子目录的多站点
如果你想要一个带有子目录的多站点安装,你需要包含存储在 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; }
具有子域的多站点
如果您想要使用子域进行多站点安装,则需要配置此服务器块以使用通配符侦听域:
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 和其他网站
如果您想托管简单的 html 网站或其他 web 应用程序,您可能需要指定自定义规则或创建更多 .conf 文件并将它们包含在服务器块中:
# 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 }
记得保存并退出。
启用服务器块文件
最后一步是通过在站点可用目录和站点启用目录之间创建符号链接来激活主机:
sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo
我们对配置进行了很多更改。 重新加载 NGINX 并使更改可见。
sudo service nginx reload;
最后的笔记
要创建其他虚拟主机,您只需重复上述过程,每次都要小心设置一个具有适当新域名的新文档根目录。 也可以将多个服务器块组合在一个文件中:
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....