在 Ubuntu 18.04 |20.04 上利用 Nginx 反向代理 Apache 安装 WordPress(启用 Let’s Encrypt SSL)

在 Ubuntu 18.04 |20.04 上利用 Nginx 反向代理 Apache 安装 WordPress(启用 Let's Encrypt SSL)

在腾讯云服务器的 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
Apache 的运行状态
Apache 的运行状态(显示 active 表明运行正常)
Nginx 的运行状态
Nginx 的运行状态(显示 active 表明运行正常)

要保证两个 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
Nginx 配置文件
Nginx 配置文件

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
登录 MariaDB

安装好了 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 方式校验域名所有权
–serverLet’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。

运行命令之后,命令行输出如下信息,如果你有服务器的权限,输入“y”继续:

安装 Let’s Encrypt SSL
安装 Let’s Encrypt SSL

输入 yes 之后它会要求你在 DNS 记录里配置一个 txt 记录:

配置 SSL DNS TXT 记录
配置 DNS TXT 记录

如果你用的是腾讯云服务器,在下面这里配置就可以了

腾讯云配置DNS TXT记录
腾讯云配置 DNS TXT 记录

配置完成后,回到命令行界面,回车验证 DNS 记录,如果没有问题,会输出如下信息:

Let’s Encrypt SSL 证书获取成功
Let’s Encrypt SSL 证书获取成功

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-ProtectionClickjackingMIME SniffingReferrer PolicyAccess 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 分钟安装”了 。

在浏览器地址栏输入你的域名,出现如下界面:

WordPress 经典安装流程
WordPress 经典安装流程

点击 “Let’s go”:

WordPress 会提示你输入 数据库用户名, 密码主机名

输入数据库名称、用户名、密码和主机名。
WordPress 连接数据库

输入我们在上面设置的数据库名称用户名密码主机名

数据库连接成功后如果出现以下界面,直接复制方框内的代码,自己创建 wp-config.php 文件即可,在此不再赘述。

WordPress 无法创建 wp-config.php 文件
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 安装后台

总结

到此,我们已经完成了 WordPress 和 Nginx作为Apache的反向代理的配置安装,并安装了 SSL 证书。

现在你有了一个高性能的WordPress安装,它具有 Apache 和 Nginx 的双重优点。

发表评论

项目已添加到购物车。
0 项 - ¥0.00