Nginx 配置教程
本教程介绍如何 Web 应用配置 Nginx 反向代理,并开启 HTTPS 支持。
1. 生成自签名证书
内网测试环境可使用自签名证书。生产环境建议使用 Let's Encrypt 或正式 CA 签发的证书。
创建证书目录并生成证书:
bash
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 3650 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/deplos.lab.key \
-out /etc/nginx/ssl/deplos.lab.crt \
-subj "/CN=deplos.lab"-days 3650 表示证书有效期 10 年,可根据需要调整。
设置文件权限:
bash
sudo chmod 600 /etc/nginx/ssl/deplos.lab.key
sudo chmod 644 /etc/nginx/ssl/deplos.lab.crt2. 完整配置示例
创建配置文件:
bash
vi /etc/nginx/conf.d/deplos-dev.conf写入以下内容:
nginx
server {
listen 443 ssl;
server_name deplos.lab;
# 自签名证书路径(内网测试用)
ssl_certificate /etc/nginx/ssl/deplos.lab.crt;
ssl_certificate_key /etc/nginx/ssl/deplos.lab.key;
# 强制使用的安全协议和加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# 转发至 deplos 服务端口
proxy_pass proxy_pass http://127.0.0.1:9100;
# 传递客户端真实信息
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# 响应超时
proxy_read_timeout 300s;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}3. 配置说明
3.1 SSL 配置
listen 443 ssl: 监听 443 端口并启用 SSL。ssl_certificate: 指定 SSL 证书文件的完整路径。ssl_certificate_key: 指定 SSL 私钥文件的完整路径。ssl_protocols: 强制使用 TLSv1.2 和 TLSv1.3 协议。ssl_ciphers: 排除不安全的加密套件。
3.2 反向代理
proxy_pass: 将所有请求转发至本地的 9100 端口。X-Forwarded-Proto: 告知后端程序原始请求使用的是 HTTPS 协议。X-Forwarded-For: 传递客户端真实 IP 链。X-Real-IP: 传递客户端真实 IP 地址。proxy_read_timeout: 后端响应超时时间,默认 60s,建议设为 300s。
3.3 WebSocket
以下两行配置确保 Nginx 能正确处理协议升级请求:
nginx
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";4. HTTP 自动跳转 HTTPS(可选)
如需将 http://deplos.lab 自动重定向到 HTTPS,请在同一个配置文件(/etc/nginx/conf.d/deplos-dev.conf)的底部,追加以下配置段:
nginx
server {
listen 80;
server_name deplos.lab;
return 301 https://$host$request_uri;
}5. 应用配置
完成编辑后,请按照以下步骤检查并使配置生效:
检查语法错误:
bashnginx -t如果显示
syntax is ok和test is successful,则表示配置无误。重新加载 Nginx:
bashsystemctl reload nginx
6. 常见问题
- 防火墙设置:如果无法访问,请检查防火墙是否允许 80 和 443 端口的流量:bash
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload - Hosts 解析:由于
server_name设置为deplos.lab,测试时请确保您的客户端hosts文件已将该域名正确指向服务器 IP。