如何在 Rocky Linux 8 上使用 Nginx Web 服务器设置 Varnish SSL 终止
在此页
- 先决条件
- 安装 Nginx 网络服务器
- 使用 Certbot 生成 SSL
- 设置默认 Nginx 端口
- 使用 Nginx Web 服务器设置 SSL 终止
- 使用 Varnish 自动从 HTTP 到 HTTPS
- 验证 Varnish SSL 终止
- 结论
Varnish 缓存软件默认不支持 SSL/TLS。您需要额外的软件才能在 Varnish 上启用 SSL/TLS 支持。
SSL Termination 是一种在 Varnish 上启用 SSL/TLS 的方法。您可以使用 Hitch、Nginx 或 Apache 为 Varnish HTTP 加速器启用 SSL 终止。
SSL 终止软件将在 HTTPS 端口 443 上运行,并处理来自客户端的所有 HTTPS 请求。之后,所有的请求都会被转发到varnish缓存软件,再转发到源站后端服务器。
先决条件
在本文中,您将学习如何使用 Nginx Web 服务器设置 Varnish SSL Termination。
在开始之前,请确保满足以下要求:
- 安装了 Varnish 的 Linux 服务器。
- 根权限
- 域名
对于这个例子,我们使用的是安装了 Varnish 的 Rocky Linux 服务器。我们将使用域名 example.io。
现在让我们开始吧。
安装 Nginx 网络服务器
如果您使用 Nginx 作为 Varnish 后端,请跳过这第一步。
在第一步中,您将在 Linux 系统上安装 Nginx。
1. 对于基于 Debian/Ubuntu 的发行版,执行下面的 apt 命令来安装 Nginx Web 服务器。
sudo apt install nginx -y
2. 对于CentOS/RockyLinux/AlmaLinux 操作系统,执行下面的DNF 命令安装Nginx Web 服务器。
sudo dnf install nginx -y
3. Nginx 安装完成后,使用以下命令启动并启用 Nginx Web 服务器。
sudo systemctl enable --now nginx
如果您遇到错误,请留下它。您将在下一步中配置 Nginx。
使用 Certbot 生成 SSL
在此步骤中,您将安装 cerbot 工具并从 Letsencrypt 为域 example.io 生成 SSL 证书。
1、首先在系统防火墙中添加HTTP和HTTPS端口。
对于 Debian/Ubuntu 系统,执行下面的 ufw 命令打开 HTTP 和 HTTPS 端口。
sudo ufw allow http
sudo ufw allow https
sudo ufw reload
对于 CentOS/RockyLinux/AlmaLinux 系统,执行下面的 firewall-cmd 命令。
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
2. 接下来,使用以下命令安装 certbot 工具。
使用下面的 apt 命令在 Debian/Ubuntu 系统上安装 certbot 工具。
sudo apt install certbot -y
使用下面的 DNF 命令在 CentOS/RockyLinux/AlmaLinux 系统上安装 certbot 工具。
sudo dnf install certbot -y
3. 在生成 SSL Letsencrypt 之前,停止在默认 HTTP 端口上运行的 Varnish 服务。
sudo systemctl stop varnish
sudo systemctl stop nginx
4. 现在执行下面的 certbot 命令来生成 SSL Letsencrypt。并确保更改域名和电子邮件地址。
sudo certbot certonly --agree-tos --email --standalone --preferred-challenges http -d example.io
certbot 进程完成后,您的证书将在目录 /etc/letsencrypt/live/DOMAIN.COM/ 中可用。
证书 fullchain.pem 是您的 SSL 公钥,privkey.pem 是您的 SSL 私钥。
设置默认 Nginx 端口
如果您使用 Nginx 网络服务器作为 Varnish HTTP 加速器的后端,请跳过此步骤。
如果您使用另一个后端 Web 服务器,则必须为 Nginx 配置默认端口。
1. 使用 nano 编辑器编辑默认的 nginx 配置。
sudo nano /etc/nginx/nginx.conf
在默认的 server { ... } 部分,将选项 listen 更改为端口 8081,如下所示。
....
server {
listen 8081 default_server;
listen [::]:8081 default_server;
...trim...
}
....
保存配置并退出。
2. 现在重新启动 Nginx 服务以应用新配置。
sudo systemctl restart nginx
默认的 Nginx 服务现在在 8081 端口上运行。
使用 Nginx Web 服务器设置 SSL 终止
要使用 Nginx 设置 SSL 终止,您需要创建一个将在 HTTPS 端口 443 上运行的新虚拟主机/服务器块配置。
此虚拟主机处理来自客户端的所有 HTTPS 请求,并将所有请求转发到 Varnish HTTP 加速器。
1. 使用以下命令创建新的 Nginx 服务器块配置。
如果您使用的是基于 Debian/Ubuntu 的系统,请创建一个新配置 /etc/nginx/sites-available/example.io。
sudo nano /etc/nginx/sites-available/example.io
对于CentOS/RockyLinux/AlmaLinux系统,新建配置/etc/nginx/conf.d/example.conf。
sudo nano /etc/nginx/conf.d/example.conf
复制并粘贴以下配置。并确保更改 SSL 证书的域名和路径。
server {
listen 443 ssl http2;
server_name example.io;
ssl_certificate /etc/letsencrypt/live/exmaple.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.io/privkey.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/example.io_access.log;
error_log /var/log/nginx/example.io_error.log;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
}
保存配置并退出。
2. 接下来,对于 Debian/Ubuntu 系统,使用以下命令激活服务器块配置。
sudo ln -s /etc/nginx/sites-available/example.io /etc/nginx/sites-enabled/
3. 现在执行以下命令来验证 Nginx 配置,然后重启 Nginx 服务以应用新配置。
sudo nginx -t
sudo systemctl restart nginx
4. 现在使用以下命令验证 Nginx 服务和 HTTPS 端口 443。
使用下面的 systemctl 命令验证 Nginx 服务状态。
sudo systemctl status nginx
确保 Nginx 服务处于活动状态并正在运行。

使用下面的 ss 命令验证您系统上的 HTTPS 端口 443。
ss -antpl | grep 443
确保 HTTPS 端口 443 处于 LISTEN 状态。
LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=4787,fd=8),("nginx",pid=4786,fd=8),("nginx",pid=4785,fd=8))
现在您已经完成了使用 Nginx 网络服务器终止 SSL 的基本配置。
使用 Varnish 自动从 HTTP 到 HTTPS
在此步骤中,您将设置 Varnish 以自动将 HTTP 重定向到 HTTPS 协议。这可以通过在配置 default.vcl 上创建新的 Varnish 规则来实现。
1. 使用 nano 编辑器编辑清漆配置 /etc/varnish/default.vcl。
nano /etc/varnish/default.vcl
将以下配置复制并粘贴到选项 sub vcl_recv { ... } 中。并确保使用您的域更改域名。
sub vcl_recv {
...trim...
if (client.ip != "127.0.0.1" && req.http.host ~ "example.io") {
set req.http.x-redir = "https://example.io" + req.url;
return(synth(850, ""));
}
...trim...
{
接下来,将以下配置添加到该行的底部。这将确定重定向到 HTTP 301 的方法。
sub vcl_synth {
if (resp.status == 850) {
set resp.http.Location = req.http.x-redir;
set resp.status = 301;
return (deliver);
}
}
保存清漆配置并退出。
2. 接下来,使用以下命令重新启动 Varnish 服务以应用新配置。
sudo systemctl restart varnish
您已经使用 Varnish 规则完成了自动 HTTP 和 HTTPS 重定向。
验证清漆 SSL 终止
要测试 Varnish SSL 终止,您可以使用网络浏览器或使用 curl 命令。
1. 打开您的网络浏览器并在地址栏中输入您的域名。对于此示例,我们使用的是 Firefox Web 浏览器。
http://example.io
您将被自动重定向到 HTTPS 协议。
右键单击网页,然后单击菜单检查。
移至网络 选项卡并单击重新加载 按钮。
单击根 URL 请求,您将看到类似如下的输出。

对 http://example.io 的请求会自动重定向到 HTTPS 协议 https://example.io,状态代码为 301。
Varnish 服务器处理所有客户端请求。
2. 要使用 curl 验证 varnish SSL 终止,请使用以下命令。
curl -I http://example.io
您将看到详细的 HTTP 标头,如下所示。

请求被重定向到 HTTPS 协议 https://example.io,HTTP 状态代码为 301。清漆服务器处理来自客户端的所有请求。
结论
恭喜!您已经学习了使用 Nginx Web 服务器配置 Varnish SSL Termination。
此外,您还学习了用于生成免费 SSL Letsencrypt 的基本 certbot 命令和用于自动从 HTTP 重定向到 HTTPS 的基本 varnish 规则。