Hostwinds 教程
寻找结果为:
目录
标签: Cloud Servers, SSL, VPS
如果您在私人端口上运行Web应用程序(例如 Localhost:3000),它无法通过互联网直接访问。安全地曝光该应用程序的最有效方法之一是将反向代理放在其前面。
NGINX是一种轻巧的知名工具,可以做到这一点 - 接收传入的流量并将其转发到您的应用程序 - 同时还通过Let's Encrypt的免费SSL证书来处理HTTPS。
在本指南中,您将学习如何:
Web服务器新的?查看我们的解释 网络服务器的工作方式.
一种 反向代理 是位于用户和后端服务之间的服务器。Nginx首先接收流量,然后将其传递给在后台运行的应用程序。
这就是为什么这种方法如此有用的原因:
即使您的应用程序已经可以处理Web流量,使用NGINX作为反向代理也经常简化设置,提高灵活性并增加控制。
在开始之前,让我们确保您拥有所需的一切:
A yourdomain.com → 123.123.123.123
A www.yourdomain.com → 123.123.123.123
传播可能需要几分钟到几个小时。
不知道如何配置DNS?这是 如何添加记录 与大多数域主机。
注意: 如果您的应用程序尚未运行,那没关系 - 您仍然可以通过设置进行测试。
sudo apt update
sudo apt install nginx
然后检查它正在运行:
sudo systemctl status nginx
您应该看到"活动(运行)"。
sudo apt install certbot python3-certbot-nginx
此插件可让Certbot在请求证书时自动修改您的NGINX配置 - 基本设置不需要手动编辑。
有另一个操作系统?遵循本指南 如何安装让我们加密 在Fedora和Debian上
现在您的系统已经准备好了,第一个真正的步骤是配置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;
}
}
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传递到您的应用程序。
通过通过HTTP工作的反向代理,下一步是使用HTTPS保护它。这为用户与服务器之间的所有通信增加了加密 - 保护登录凭据,API请求,个人数据等。
您将使用让我们加密的,免费的证书授权和Certbot,该授权机构可以自动化该过程。
运行此命令,用您的实际值代替域:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
这是怎么回事:
certbot将:
提示: 如果您的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证书查看您的网站。
如果您在Certbot设置期间没有选择重定向选项,则可以手动添加此内容:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
这迫使所有HTTP流量都将重定向到HTTP,这确保用户不会意外地使用网站的不安全版本。
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安全评分,并保护访客免受降级攻击或不安全的加密选择。
可选的: 您可以使用SSL实验室测试您的网站,以查看配置的性能并获得特定的改进建议。
为了更强的加密,您可以生成自定义的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组需要几分钟,但这是一次性的步骤,值得为更好的安全姿势做。
让我们加密证书每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定期升级。更新的软件包修复了错误,提高兼容性和补丁安全问题。
一旦掌握了设置安全反向代理的基础知识,就可以扩展配置以支持更复杂的需求。以下是一些常见的方案,可以帮助您从服务器中获得更多信息。
如果您在不同端口上运行多个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