Hostwinds 教程

寻找结果为:


目录


什么是反向代理,为什么要使用一个?
先决条件
步骤1:设置NGINX反向代理
为什么这很重要
创建一个新的服务器块
这种配置的作用
启用配置
步骤2:与Let's Encrypt和certbot一起添加SSL
为什么https很重要
请求证书
验证更改
可选:力https
步骤3:改进SSL设置(建议生产)
这些设置做什么
步骤4 :(可选)添加diffie-hellman参数
为什么要添加这个?
步骤5:为SSL证书设置自动续订
最后一步和良好的习惯
SSL的NGINX反向代理的高级用例
在一台服务器上托管多个应用程序
基于路径的代理
添加限制率以保护您的应用程序
负载跨多个后端服务器平衡
记录和调试
自定义标题和安全性增强功能

Nginx反向代理与SSL

标签: Cloud Servers,  SSL,  VPS 

什么是反向代理,为什么要使用一个?
先决条件
步骤1:设置NGINX反向代理
为什么这很重要
创建一个新的服务器块
这种配置的作用
启用配置
步骤2:与Let's Encrypt和certbot一起添加SSL
为什么https很重要
请求证书
验证更改
可选:力https
步骤3:改进SSL设置(建议生产)
这些设置做什么
步骤4 :(可选)添加diffie-hellman参数
为什么要添加这个?
步骤5:为SSL证书设置自动续订
最后一步和良好的习惯
SSL的NGINX反向代理的高级用例
在一台服务器上托管多个应用程序
基于路径的代理
添加限制率以保护您的应用程序
负载跨多个后端服务器平衡
记录和调试
自定义标题和安全性增强功能

如果您在私人端口上运行Web应用程序(例如 Localhost:3000),它无法通过互联网直接访问。安全地曝光该应用程序的最有效方法之一是将反向代理放在其前面。

NGINX是一种轻巧的知名工具,可以做到这一点 - 接收传入的流量并将其转发到您的应用程序 - 同时还通过Let's Encrypt的免费SSL证书来处理HTTPS。

在本指南中,您将学习如何:

  • 将NGINX设置为内部Web服务的反向代理
  • 使用certbot使用SSL证书将其固定
  • 了解配置的每个部分,以便您知道它在做什么以及为什么

Web服务器新的?查看我们的解释 网络服务器的工作方式.

什么是反向代理,为什么要使用一个?

一种 反向代理 是位于用户和后端服务之间的服务器。Nginx首先接收流量,然后将其传递给在后台运行的应用程序。

这就是为什么这种方法如此有用的原因:

  • 隐藏内部端口和服务
    您的应用不需要直接接触公众。这会降低攻击表面并帮助您控制访问。
  • 为您处理HTTP
    许多Web框架可以直接服务HTTP,但是让Nginx这样做通常更容易,更可靠,尤其是在使用Let's Genterpt的免费SSL证书时。
  • 启用在一台服务器上托管多个服务
    您可以在不同端口(例如3000、4000、5000)上运行多个应用程序,并仅使用一个公共IP来基于域或路径路由流量。
  • 改善记录和监视
    NGINX为您提供集中式访问和错误日​​志,因此监视性能或调查问题更容易。
  • 提供可选的缓存,负载平衡和限制速率
    您可以优化流量流,并在Nginx配置中只有几行来保护后端服务。

即使您的应用程序已经可以处理Web流量,使用NGINX作为反向代理也经常简化设置,提高灵活性并增加控制。

先决条件

在开始之前,让我们确保您拥有所需的一切:

  • 运行Ubuntu的VPS或云服务器20.04或更高版本: 本教程中使用的大多数命令和软件包版本都假设基于Debian的系统。虽然Nginx和Certbot在其他分布上工作,但设置过程可能会有所不同。
  • root或sudo访问: 您将安装软件包,编辑系统文件和重新启动服务 - 所有这些都需要提高特权。
  • 注册域名: 您将需要此要求SSL证书。在发布证书之前,让我们加密验证您的域的所有权。如果没有DNS指向您的服务器,验证将失败。
  • DNS指向您的服务器的公共IP: 确保更新了域的DNS记录。一个简单的记录指向您的服务器IP就足够了:
A yourdomain.com → 123.123.123.123
A www.yourdomain.com → 123.123.123.123

传播可能需要几分钟到几个小时。

不知道如何配置DNS?这是 如何添加记录 与大多数域主机。

  • 在Localhost上运行的应用程序(例如 http://localhost:3000): 这是您将要使用的应用程序。它可能是任何东西 - node.js,python烧瓶,轨道上的红宝石等。只要在当地端口聆听,您就可以代理。

注意: 如果您的应用程序尚未运行,那没关系 - 您仍然可以通过设置进行测试。

  • 安装了nginx: Nginx将充当面向公共的服务器。如果尚未安装:
sudo apt update
sudo apt install nginx

然后检查它正在运行:

sudo systemctl status nginx

您应该看到"活动(运行)"。

  • 使用NGINX插件安装CERTBOT: CERTBOT自动从Let's Encrypt获得和更新SSL证书的过程。这样安装:
sudo apt install certbot python3-certbot-nginx

此插件可让Certbot在请求证书时自动修改您的NGINX配置 - 基本设置不需要手动编辑。

有另一个操作系统?遵循本指南 如何安装让我们加密 在Fedora和Debian上

步骤1:设置NGINX反向代理

现在您的系统已经准备好了,第一个真正的步骤是配置Nginx以侦听域上的流量并将其转发到您的内部应用程序 - 这就是使Nginx充当反向代理的原因。

为什么这很重要

没有此设置,试图访问您的网站的用户将击中一个空页面或默认的NGINX欢迎屏幕。您需要明确告诉Nginx:

  • 哪个领域应该回应
  • 如何处理传入请求
  • 在哪里发送幕后流量

创建一个新的服务器块

您将在NGINX的网站可用目录中为您的域创建一个配置文件。这样可以使配置组织起来,并易于启用或禁用单个站点。

sudo nano /etc/nginx/sites-available/yourdomain.com

粘贴在以下块中,根据需要调整域和应用端口:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;

        # Pass important headers to the backend
        proxy_set_header Host $host;
        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 $scheme;
    }
}

这种配置的作用

  • 听80;
    告诉NGINX在端口80上收听HTTP流量。
  • server_name yourdomain.com www.yourdomain.com;
    将此块与向您的域提出的请求匹配。您可以根据需要添加或删除子域。
  • 地点 /
    将所有请求捕获到根本上,并将其转发到您的应用程序。
  • proxy_pass http:// localhost:3000;
    这是反向代理的核心 - 它将请求发送到在端口3000上运行的后端应用程序。
  • proxy_set_header线
    这些保存来自原始客户端请求的详细信息,例如:
    • 用户的IP地址(X-Real-IP)
    • 原始协议(HTTP或HTTPS)
    • 原始主机名
  • 此信息对于记录,分析或应用程序需要生成与访问者体验相匹配的URL很有用。

启用配置

nginx使用符号链接 启用站点 激活站点的目录。因此,现在您将创建一个链接并重新加载nginx:

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t

检查语法错误。如果一切看起来都不错:

sudo systemctl reload nginx

您的反向代理现在已经存在 - 请求 http://yourdomain.com 将通过端口3000传递到您的应用程序。

步骤2:与Let's Encrypt和certbot一起添加SSL

通过通过HTTP工作的反向代理,下一步是使用HTTPS保护它。这为用户与服务器之间的所有通信增加了加密 - 保护登录凭据,API请求,个人数据等。

您将使用让我们加密的,免费的证书授权和Certbot,该授权机构可以自动化该过程。

为什么https很重要

  • 加密流量 所以没有人可以拦截或篡改它
  • 改善SEO - 搜索引擎更喜欢安全站点
  • 建立信任 - 用户期望看到挂锁图标
  • 许多API,登录和支付系统所需

请求证书

运行此命令,用您的实际值代替域:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

这是怎么回事:

  • 告诉Certbot使用Nginx插件
  • 指定您请求哪些域名

certbot将:

  • 通过在nginx配置中创建临时文件来执行域验证
  • 联系我们加密验证域名
  • 下载您的SSL证书和私钥
  • 修改您的nginx配置以使用https
  • 可选地将所有HTTP流量重定向到HTTP

提示: 如果您的DNS尚未完全传播或服务器防火墙块端口80,则验证将失败。您可以对此进行测试:

curl -I http://yourdomain.com

为了更好地了解端口,请查看我们的指南 Web服务器端口如何工作.

验证更改

Certbot完成后,您的Nginx配置应包括类似的内容:

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

现在,您应该可以访问https://yourdomain.com,并使用有效的SSL证书查看您的网站。

可选:力https

如果您在Certbot设置期间没有选择重定向选项,则可以手动添加此内容:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

这迫使所有HTTP流量都将重定向到HTTP,这确保用户不会意外地使用网站的不安全版本。

步骤3:改进SSL设置(建议生产)

SSL证书到位后,您可以微调NGINX以提高安全性和兼容性。这些设置位于HTTPS服务器块内。

这是一个改进的例子:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

这些设置做什么

  • ssl_protocols TLSv1.2 TLSv1.3
    禁用较旧的,较不安全的协议,例如TLS 1.0和1.1。
  • ssl_prefer_server_ciphers on
    让您的服务器决定加密算法,而不是将其推迟到浏览器,这可以减少暴露于弱的密码攻击。
  • ssl_ciphers高:!anull:!md5
    指定强密码套件并排除弱或破损的密码套件(例如MD5和Null Ciphers)。
  • ssl_session_cache和ssl_session_timeout
    控制SSL会话重用,可以稍微提高性能而不会损害安全性。
  • ssl_session_tickets关闭
    禁用会话门票,如果不定期旋转,这可能是安全问题。

这些更改提高了您的SSL安全评分,并保护访客免受降级攻击或不安全的加密选择。

可选的: 您可以使用SSL实验室测试您的网站,以查看配置的性能并获得特定的改进建议。

步骤4 :(可选)添加diffie-hellman参数

为了更强的加密,您可以生成自定义的Difie-Hellman(DH)密钥。此步骤是可选的,但通常建议用于生产环境。

运行此命令生成2048位DH组:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

然后将以下行添加到您的SSL Server块:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

为什么要添加这个?

Diffie-Hellman参数加强 远期保密,这意味着即使您的私钥将来会以某种方式妥协,过去的加密会议仍然是安全的。

生成DH组需要几分钟,但这是一次性的步骤,值得为更好的安全姿势做。

步骤5:为SSL证书设置自动续订

让我们加密证书每90天到期。幸运的是,Certbot安装了系统计时器,该系统计时器每天两次检查由于到期而自动续订证书。

您可以确认计时器活跃:

sudo systemctl list-timers | grep certbot

您应该看到这样的东西:

NEXT                         LEFT    LAST                         PASSED  UNIT           ACTIVATES
2025-06-19 04:00:00 UTC      12h     2025-06-18 04:00:00 UTC       11h ago certbot.timer  certbot.service

要手动测试续订过程(无需更改),请运行:

sudo certbot renew --dry-run

这模拟了完整的续订过程,并确认您的系统准备自动处理它。

如果没有错误,您的证书将在后台悄悄地更新。

最后一步和良好的习惯

现在,您的反向代理已经建立并使用SSL确保,最好总结一些实际的检查和最佳实践。

这些简单的习惯可以帮助防止问题解决,使您的配置更易于维护,并确保一切都按照您的期望来运行。

即使一切似乎都在起作用,在这里额外花费几分钟也可以节省您的时间和麻烦。

重新启动您的应用程序不会自动检测更改
一些应用需要重新启动才能在代理后面正确工作。

检查日志
您可以监视错误或不寻常流量的NGINX日志:

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

保持nginx和certbot更新
使用Sudo APT Update && SUDO APT定期升级。更新的软件包修复了错误,提高兼容性和补丁安全问题。

SSL的NGINX反向代理的高级用例

一旦掌握了设置安全反向代理的基础知识,就可以扩展配置以支持更复杂的需求。以下是一些常见的方案,可以帮助您从服务器中获得更多信息。

在一台服务器上托管多个应用程序

如果您在不同端口上运行多个Web应用程序,则NGINX可以根据域或URL路径将请求路由到每个应用程序。

示例:不同的域

server {
    listen 80;
    server_name app1.example.com;

    location / {
        proxy_pass http://localhost:3001;
        # proxy headers here
    }
}

server {
    listen 80;
    server_name app2.example.com;

    location / {
        proxy_pass http://localhost:3002;
        # proxy headers here
    }
}

此设置允许您使用单独的子域使用多个应用程序,所有这些都可以通过标准端口上的NGINX使用。

使用Docker?学习 如何使用nginx代理多个Docker应用.

基于路径的代理

另外,您可以基于URL路径代理,如果您希望在一个域下所有应用程序:

server {
    listen 80;
    server_name example.com;

    location /app1/ {
        proxy_pass http://localhost:3001/;
        # proxy headers here
    }

    location /app2/ {
        proxy_pass http://localhost:3002/;
        # proxy headers here
    }
}

注意: 在使用基于路径的代理时,拖延斜线和URL重写可能会变得棘手 - 请确保您的后端应用程序可以处理在子路径下。

添加限制率以保护您的应用程序

您可以限制客户在给定时间范围内可以提出多少要求,以保护您的后端免受滥用或意外超负荷的影响。

在/etc/nginx/nginx.conf中的http块中添加它:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

然后在您的服务器或位置块中:

limit_req zone=mylimit burst=20 nodelay;

这种配置允许每秒10个请求,最多包含20个请求,从而避免了多余的请求,以避免使您的应用不堪重负。

负载跨多个后端服务器平衡

如果您的应用程序运行的几个实例(例如,多个容器或VPS),Nginx可以分发流量:

upstream backend {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        # proxy headers here
    }
}

nginx余额默认情况下请求循环蛋白,但是您可以将其配置为其他方法,例如最小的连接或IP哈希。

要了解更多信息,请查看我们的指南 DNS负载平衡.

记录和调试

您可以自定义日志记录以包含用于故障排除或分析的重要代理信息:

log_format proxy '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" '
                 'upstream_response_time $upstream_response_time '
                 'request_time $request_time';

access_log /var/log/nginx/proxy_access.log proxy;

这将记录上游响应时间和总请求时间,有助于识别后端缓慢的响应。

自定义标题和安全性增强功能

您可能需要添加或修改HTTP标头以进行安全性或功能:

add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy no-referrer-when-downgrade;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

这些标头可以防止插锁,哑剧嗅探和强制使用HTTPS使用。

撰写者 Hostwinds Team  /  六月 14, 2019