在腾讯云服务器的 Ubuntu 系统上利用 Nginx 反向代理 Apache 安装 WordPress,以及 PHP 7.4, Nginx, Apache, Let’s Encrypt SSL, MariaDB 等。
勺子在之前已经介绍了如何手动搭建 LNMP 环境。在本指南中,你将学习如何使用两个最受欢迎的 Web 服务器 Nginx 和Apache 来安装 WordPress。
通过这个方法,你可以充分利用 Apache 和 Nginx 这两个 Web 服务器的有点,以此来提升网站的性能,也给那些纠结于选择 Apache 还是 Nginx 的站长一个终极解决方案。
为你的外贸网站选择最佳主机
平台 | 评价 | 价格 |
---|---|---|
SiteGround | ★★★★★ | $6.99 |
ChemiCloud | ★★★★★ | $3.95 |
目录
安装环境:
Ubuntu 18.04 |20.04 LTS
安装 Apache
一旦你的服务器安装完了镜像并成功启动运行,就可以安装 Apache 了。
sudo apt install apache2
需要将 Apache 配置为在不同的端口上侦听,因为 Nginx 将作为 Apache 的代理侦听 HTTP 和 HTTPS 流量,这是关键。
配置 Apache 的端口
你可以把 Apache 的监听端口设置为 8081
,打开 ports.conf 文件。
sudo vim /etc/apache2/ports.conf
修改端口为 8081,如下所示。
Listen 8081
输入 :wq
保存退出即可!
重启以下 Apache:
sudo systemctl restart apache2
安装 Nginx
输入如下命令安装 Nginx。
sudo apt install nginx
安装完成后,用命令检查一下这两个 Web 服务器的运行状态。
sudo service apache2 status sudo service nginx status
要保证两个 Web 服务器都正常运行才能进行以下的步骤。
网站设置
网站默认在 /var/www/html
文件夹下,用你的域名创建一个文件夹。
cd /var/www/html
sudo mkdir anspoon.com
把 anspoon.com 换成你自己的域名即可。
网站的文件结构如下:
/var/www/html -- anspoon.com ---- public
public
目录是你网站的根目录,直接用以下命令创建即可:
(记住把 anspoon.com 换成你自己的域名)
sudo mkdir -p /var/www/html/anspoon.com/public
设置 Apache 的 Virtual Host
上面把 Apache 的监听端口设置成了 8081,下面就可以设置 Apache 的虚拟主机了。
首先,去掉默认的虚拟主机配置:
sudo a2dissite 000-default
创建新的配置文件:
sudo vim /etc/apache2/sites-available/anspoon.conf
复制以下代码到刚刚创建的 Virtual Host 配置文件中。
<VirtualHost *:8081> ServerName anspoon.com DocumentRoot /var/www/html/anspoon.com/public <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/html/anspoon.com/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all Require all granted </Directory> </VirtualHost>
同样,把上面的 anspoon.com 换成自己的域名。
输入 :wq
退出保存即可。
让新的配置文件生效:
sudo a2ensite anspoon.conf
同样地,把 anspoon.conf 换成你自己在上面创建的配置文件。
启用 Apache 的 rewrite mode 模块。
sudo a2enmod rewrite
重启 Apache:
sudo systemctl restart apache2
配置 Nginx
如果你的服务器开启了防火墙,要确保 HTTP and HTTPS 端口是可以访问的。
sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full'
接下来,打开 Nginx 的配置文件,配置文件的位置在:/etc/nginx/nginx.conf
sudo vim /etc/nginx/nginx.conf
worker_processes 指你的服务器的核心数,比如我用的是腾讯 2 核 4 G 的云服务器,就可以改成 2,当然如果你不知道你的服务器 CPU 核心数,配置成 auto
就可以了。
把 multi_accept 参数的注释去掉,并把它设置成 on
,见上图。
把 keepalive_timeout 参数的值调低一点,比如 15
,当然使用默认的值也可以。
出于安全的考虑,你可以去掉 server_tokens 参数前的注释并设置成 off
的状态。
在 server_tokens
下面新增 client_max_body_size 参数并把它的值设置成 64m
。
取消 gzip_proxied 参数的注释并把值设置成 any
, 取消 gzip_comp_level 参数的注释并把值设置成 2
。
最后,取消 gzip_types 参数的注释。
接下来,你需要增加一个 catch-all
的块到配置文件中,找到 include /etc/nginx/sites-enabled/*;
所在的行,
在这行下面加入以下配置块:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
输入 :wq
保存退出即可。
为了让 Nginx 准确地运行 PHP,我们还需要启用 fastcgi_param SCRIPT_FILENAME
(否则,当你运行 PHP 脚本的时候,你可能会收到一个空白的页面)。
用以下命令打开 fastcgi_params 文件。
sudo vim /etc/nginx/fastcgi_params
在文件的末尾加上以下配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
好了,以上就是 Nginx 的基本配置,输入 :wq
保存即可。
你可以删除 Nginx 的默认配置:
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default
测试 Nginx 的配置是否准确
sudo nginx -t
重启 Nginx
sudo service nginx restart
设置 Nginx 作为反向代理
上面我们已经完成了 Nginx 的基本配置,接下来就可以通过创建新的 server blocks 来完成反向代理的配置。
(还是要提醒你以下,把 anspoon.conf 换成你自己的配置文件)
sudo vim /etc/nginx/sites-available/anspoon.conf
复制以下配置到配置文件中:
server { listen [::]:80; listen 80; server_name anspoon.com; root /var/www/html/anspoon.com/public; index index.php; location / { try_files $uri @apache; } location ~ ^/\.user\.ini { deny all; } location ~* \.(svg|svgz)$ { types {} default_type image/svg+xml; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location @apache { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~[^?]*/$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~ \.php$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~/\. { deny all; access_log off; log_not_found off; } }
输入 :wq
保存这个文件即可!
启用这个配置:
sudo ln -s /etc/nginx/sites-available/anspoon.conf /etc/nginx/sites-enabled/anspoon.conf
检查 Nginx 配置是否准确并重启:
sudo nginx -t sudo service nginx restart
如果一切正常,现在 Nginx 就是 Apache 的一个反向代理了。
提示:以上涉及到 anspoon
的地方,替换成你自己的域名名称即可(感觉好像已经提示来无数遍这个问题)
安装 MariaDB 和 创建WordPress 数据库
输入如下命令安装 MariaDB:
sudo apt-get install mariadb-server mariadb-client
进行安全设置:
sudo mysql_secure_installation
根据提示,按以下进行选择
- Enter current password for root (enter for none): 回车
- Set root password? [Y/n]: Y
- New password: 输入密码
- Re-enter new password: 再次输入密码确认
- Remove anonymous users? [Y/n]: Y
- Disallow root login remotely? [Y/n]: Y
- Remove test database and access to it? [Y/n]: Y
- Reload privilege tables now? [Y/n]: Y
安装好了 MariaDB,要测试数据库服务是否已成功安装,可以运行以下命令:
sudo mysql -u root -p
按提示输入 root
密码
如果看到以上界面,说明你已经成功安装了数据库。
接下来创建 WordPress 数据库
CREATE DATABASE wordpress;
创建用户名为 wpuser 的用户(new_password_here 替换为自己的密码)
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'new_password_here';
给这个用户授权访问上面创建的 wordpress 数据库
GRANT ALL ON wordpress.* TO 'wpuser'@'localhost' IDENTIFIED BY 'user_password_here' WITH GRANT OPTION;
最后,更新你的设置并退出
FLUSH PRIVILEGES; EXIT;
安装配置 PHP
sudo apt install php7.4 libapache2-mod-php php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip php7.4-redis php7.4-intl unzip -y
通过 php.ini 文件修改 PHP 的配置。
sudo vim /etc/php/7.4/apache2/php.ini
搜索以下参数并修改成如下的值:
upload_max_filesize = 32M
post_max_size = 48M
memory_limit = 256M
max_execution_time = 600
max_input_vars = 3000
max_input_time = 1000
输入 :wq
保存并退出,重启 Apache 看配置是否准确:
sudo service apache2 restart
下载 WordPress
服务器基本配置好了,现在你可以安装配置 WordPress 了。
建议你从官网下载 WordPress 的最新版本。
cd /var/www/html/anspoon.com/public sudo wget https://wordpress.org/latest.tar.gz
如果下载速度很慢的话,可以选择下载之后上传到服务器,再次不在赘述。
下载完成解压
sudo tar xzvf latest.tar.gz
你可以把解压后的文件整个拷贝到你的网站根目录:
sudo cp -a /var/www/html/anspoon.com/public/wordpress/. /var/www/html/anspoon.com/public
删掉根目录下不需要的文件:例如解压后的 wordpress
文件和原始的 tar
文件(强迫症):
sudo rm -r /var/www/html/anspoon.com/public/wordpress sudo rm -f /var/www/html/anspoon.com/public/latest.tar.gz
给你的网站文件目录设置权限:
sudo chown -R www-data:www-data /var/www/html/anspoon.com/public sudo chmod -R 755 /var/www/html/anspoon.com/public
安装免费的 Let’s Encrypt SSL 证书
HTTPS
HTTPS 是服务器和客户端(Web 浏览器)之间进行安全通信的协议。由于 Let’s Encrypt 免费 SSL 证书推广,HTTPS 被大部分网站所采用,它为访问你网站的用户提供了信任凭证。
HTTP/2
HTTP/2 是 HTTP 协议的最新版本,它可以显著地改善站点的加载时间。现在大部分的网站都启用了 HTTP/2,前提条件是你的站点必须支持 HTTPS。
首先 Certbot(简单讲 Certbot 就是一个自动获取和更新 Let’s Encrypt SSL 证书的工具)
运行以下命令安装 Certbot
sudo apt install certbot sudo apt install python3-certbot-nginx
安装好 Certbot 之后,运行以下命令获取你的证书:
sudo certbot certonly -d *.anspoon.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
其中”anspoon.com”换成你的一级域名即可。
参数 | 说明 |
---|---|
certonly | 表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。 |
–manual | 表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择 |
-d | 为那些主机申请证书,如果是通配符,输入 *.anspoon.com(可以替换为你自己的一级域名) |
–preferred-challenges dns | 使用 DNS 方式校验域名所有权 |
–server | Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。 |
运行命令之后,命令行输出如下信息,如果你有服务器的权限,输入“y”继续:
输入 yes 之后它会要求你在 DNS 记录里配置一个 txt 记录:
如果你用的是腾讯云服务器,在下面这里配置就可以了
配置完成后,回到命令行界面,回车验证 DNS 记录,如果没有问题,会输出如下信息:
Certbot 客户端会自动为您的域名生成新的证书,接下来我们需要更新 Nginx 的配置。
设置 Nginx 把 HTTP 跳转到 HTTPS
打开 Nginx 配置文件:
sudo vim /etc/nginx/sites-available/anspoon.conf
如果你觉得一个一个添加配置麻烦,可以把以下内容复制替换掉原来的所有内容,注意要把 域名和 SSL 文件证书的位置替换成你的。
ssl_certificate
路径设置成 fullchain.pem 文件所在路径
ssl_certificate_key
路径设置成 privkey.pem 文件所在路径。
server { listen [::]:80; listen 80; server_name anspoon.com anspoon.com; return 301 https://www.anspoon.com$request_uri; } server { listen [::]:443 ssl http2; listen 443 ssl http2; server_name anspoon.com; ssl_certificate /etc/letsencrypt/live/anspoon.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/anspoon.com/privkey.pem; root /var/www/html/anspoon.com/public; index index.html index.php; return 301 https://www.anspoon.com$request_uri; } server { listen [::]:443 ssl http2; listen 443 ssl http2; server_name anspoon.com; ssl_certificate /etc/letsencrypt/live/anspoon.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/anspoon.com/privkey.pem; root /var/www/html/anspoon.com/public; index index.php; location / { try_files $uri @apache; } location ~ ^/\.user\.ini { deny all; } location ~* \.(svg|svgz)$ { types {} default_type image/svg+xml; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location @apache { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~[^?]*/$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~ \.php$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8081; } location ~/\. { deny all; access_log off; log_not_found off; } }
要启用 HTTP/2 协议必须添加 http2
字段。
按照上面的配置,你已经启用了 SSL Hardening, Content Security Policy, X-XSS-Protection,Clickjacking,MIME Sniffing,Referrer Policy,Access Control Allow Origin。
这些都是 Nginx 通过关闭所有攻击区域而进行的安全调整。
输入 :wq
保存退出
检查 nginx 的配置并重启 nginx 服务器让配置生效
sudo nginx -t sudo service nginx restart
更新 SSL 证书
Let’s Encrypt 提供的证书有效期仅为90天,因此您需要经常续订。所以,你可以设置一个 cronjob 来检查将在未来30天内过期的证书并自动更新它。
sudo crontab -e
把下面这个代码加到文件底部
0 0,12 * * * certbot renew >/dev/null 2>&1
输入 :wq
保存退出
这个 cronjob 将每天两次检查两次看是否需要更新证书。
安装 WordPress
上面的步骤完成后,你就可以执行经典的“5 分钟安装”了 。
在浏览器地址栏输入你的域名,出现如下界面:
点击 “Let’s go”:
WordPress 会提示你输入 数据库
,用户名
, 密码
和主机名
。
输入我们在上面设置的数据库名称、用户名、密码和主机名。
数据库连接成功后如果出现以下界面,直接复制方框内的代码,自己创建 wp-config.php
文件即可,在此不再赘述。
创建完 wp-config.php
文件之后,先别急着安装,需要先配置 WordPress 的反向代理才能正常显示(从上图大家可以发现,安装页面有点不一样,就是因为没有让 WordPress 启用反向代理)。
配置 WordPress 以支持反向代理
现在你需要配置 WordPress 的 wp-config.php
文件以支持 HTTPS 的反向代理。
如果不设置,会造成无限重定向循环:
sudo vim /var/www/html/anspoon.com/public/wp-config.php
在顶部 <?php
代码之后加入下面这段代码:
define('FORCE_SSL_ADMIN', true); if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) $_SERVER['HTTPS']='on';
好了,你可以强制让所有的请求都使用 HTTPS 了。
配置 WordPress 文件系统
WordPress 安装完成后,我们需要设置 WordPress 文件系统的权限。我们已经给了 Web 服务器读写文件系统所需的权限,所以我们可以显式地将读写文件系统的方法设置为“direct”。如果我们不这样设置,,当我们执行诸如 WordPress 更新、插件更新、文件上传等操作时,WordPress 会提示你输入 FTP 凭据。
可以在配置文件 wp-config.php
中数据库连接设置的下面添加“direct”设置。找到 define('DB_PASSWORD', 'password');
所在的行,在它下一行复制粘贴以下代码。
define('FS_METHOD', 'direct');
输入 :wq
保存退出
好了,现在可以继续安装 WordPress 了。
总结
到此,我们已经完成了 WordPress 和 Nginx作为Apache的反向代理的配置安装,并安装了 SSL 证书。
现在你有了一个高性能的WordPress安装,它具有 Apache 和 Nginx 的双重优点。