介绍
WordPress是当今互联网上最流行的CMS(内容管理系统)。 WordPress网站可以使用HTTP服务器,如Apache或NGINX,而Apache是一个很好的选择服务网站,许多网站已转移到NGINX,因为它是可扩展的事件驱动架构,低资源和更好的静态文件的交付。 在本教程中,您将学习如何为各种类型的WordPress安装配置NGINX,包括多站点配置,重写规则和使用.conf文件应用重复的配置。
要求
在本指南中,您将需要sudo来安装和编辑文件。 我假设你已经经历了初始服务器设置。
您需要安装MySQL,PHP和NGINX。 您可以按照这些指南对LEMP安装Ubuntu的或Debian的 。
注意我们的服务器块将是不同的,在本教程中,我们使PHP-FPM使用UNIX套接字。
基本NGINX优化
调整NGINX工作进程和连接
通常建议设置NGINX工作站的数量等于处理器的数量,可以决定使用的处理器数量:
cat /proc/cpuinfo | grep processor
打开主要的NGINX配置文件:
sudo nano /etc/nginx/nginx.conf
根据系统规格增加或减少工人数量:
worker_processes 1;
NGINX限制了工作人员可以同时维护的连接数,如果您的网站有很多访问者,您可能需要增加连接限制。 理论上最大连接数= workers * limit。
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的/全球作为当前目录只是为了让事情变得更容易。
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;}
location ~ /\. {deny all;}
在Linux操作系统中的隐藏文件一开始就,获得一些隐藏文件,如的.htaccess,应该阻止出于安全原因“。”
location ~* ^.+\.(js|css|swf...
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 media目录执行。
location ~ \.php$ {...}
因为WordPress是一个PHP的网站,我们需要告诉NGINX如何将通过我们的PHP脚本到PHP5。
try_files $uri =404;
这是一个安全规则,你只是想要么成为一个确定的PHP文件或去一个404错误。
更多规则:您可能需要添加更多的NGINX规则,例如,如果使用相同的WP插件,需要在所有安装上的自定义规则,我可以在这个.conf文件中添加更多的规则,例如我使用Yoast SEO因此我在所有的网站上添加了这里需要的重写规则,这样我不必为每个服务器块复制相同的重写规则。
multisite.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的/全球性的 ,如果你想改变它,你可以输入:
cd /desired_directory
创建服务器块
现在是创建我们的第一个服务器块的时候了。 由于我们已经在.conf文件中配置了所有内容,因此不需要复制默认的服务器块文件。 让我们禁用默认服务器块:
sudo rm /etc/nginx/sites-enabled/default
并创建一个服务器块文件:
sudo nano /etc/nginx/sites-available/demo
这将打开一个空文件,根据您想要实现的内容复制以下配置:
简单的WordPress安装
试想一下,你要配置一个WordPress站点与此域www.demo.com 。 首先,我们必须创建一个服务器块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;
}
请记住更改以下数据以满足您的需要:
- 服务器名 :确定哪些服务器块用于给定的URL。
- 根 :在您的网站的存储路径。
- 访问日志和错误日志 :设置路径,您的日志
你可以看到有两个服务器块,这是因为www.demo.com &demo.com的网址不同。 你可能想确保谷歌,必应,用户...等挑选您想要的网址,在这种情况下,我希望我的网站是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网站或其他webapps,您可能需要指定自定义规则或创建更多的.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
}
记住保存并退出。
启用服务器块文件
最后一步是通过在sites-available目录和sites-enabled目录之间创建符号链接来激活主机:
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....