Debian Nginx 配置实战:HTTPS、重定向、反向代理与真实 IP
1. 服务介绍
Nginx 是高性能 Web 服务器和反向代理,常用于发布静态网页、承载 HTTPS 入口、转发后端应用、隐藏后端拓扑、缓存响应和统一记录访问日志。本文以 Debian 环境为例,串联证书申请、HTTPS 站点、HTTP 自动跳转、版本号隐藏、静态页面、HTTPS 反向代理、真实客户端 IP 和页面缓存配置。
Nginx 可以工作在 Web 服务层,也可以只作为代理入口。它不会自动替代后端 Apache、PHP-FPM 或业务应用;配置完成后必须分别验证 Nginx 本身、代理连接、后端响应和日志字段。
2. 准备运行环境
• **系统**:Debian 系 Linux;原实验记录为 Debian 10、Linux 4.19 内核。
• **权限**:root 或具备 sudo 权限的管理员账号。
• **角色**:Nginx Server 对外提供 HTTP/HTTPS;必要时另有 CA、Apache、Nginx 或应用后端;客户端使用 curl 或浏览器验证。
• **软件**:安装 nginx、openssl;如使用 Easy-RSA 或独立 CA,还要准备对应工具和签发权限。
• **域名**:准备实际域名和 DNS 记录。本文使用 <server-name>、<backend-server> 等占位符,发布时不要照抄为真实地址。
• **网络**:开放 TCP 80/443;反向代理场景还要确保 Nginx 到后端服务端口可达。
• **证书**:准备服务端私钥、证书和完整证书链。私钥权限应严格限制,不要上传私钥或真实密码。
• **目录**:确认站点根目录、日志目录、缓存目录的属主和权限;禁止用 chmod 777 代替权限规划。
• **备份**:修改 /etc/nginx/nginx.conf 和 sites-available 配置前先备份,并使用 nginx -t 检查语法。
3. 相关知识
• server 根据监听地址、端口和 server_name 匹配请求;多个站点共用 80/443 时,域名和默认站点顺序会影响匹配结果。
• HTTP 跳转优先使用 return 301 https://$host$request_uri;,比复杂 rewrite 更直观。临时测试可使用 302,确认无误后再使用 301。
• server_tokens off 只隐藏 Nginx 版本号,不能替代补丁更新、WAF、访问控制和错误页面治理。
• 反向代理要正确传递 Host、客户端地址和协议。$proxy_add_x_forwarded_for 会在已有 X-Forwarded-For 基础上追加地址;后端只有在信任代理来源时才应使用该字段作为真实 IP。
• HTTPS 代理到 HTTPS 后端时,要考虑 SNI 和证书校验。proxy_ssl_server_name on 解决 SNI 传递,生产环境还应配置可信 CA 和证书验证,不能长期依赖 proxy_ssl_verify off。
• proxy_cache 适合缓存明确可缓存的 GET/HEAD 响应;登录态、写请求和个性化内容不要直接缓存。缓存键至少要考虑 Host、URI、查询参数和协议。
• Nginx 日志中的 $remote_addr 可能是代理服务器地址;后端记录 $http_x_forwarded_for 前,必须限制可信代理,否则客户端可以伪造该请求头。
• 修改配置后先 nginx -t,再 systemctl reload nginx。reload 失败时旧 worker 可能继续服务,必须查看返回码和错误日志。
4. 实验步骤
4.1 检查系统并安装 Nginx
uname -a
apt update
apt install -y nginx openssl
systemctl enable –now nginx
确认 Nginx 版本和服务状态:
nginx -v
systemctl is-active nginx
4.2 生成服务端密钥和证书请求
在 Nginx Server 上生成私钥和 CSR。生产环境应使用企业 CA 或受信任证书机构,并根据域名填写 SAN;私钥只保留在服务端。
umask 077
openssl genrsa -out /etc/ssl/private/server.key 2048
openssl req -new -key /etc/ssl/private/server.key -out /tmp/server.csr
CSR 中的 Common Name 和 SAN 应包含实际访问域名,例如 <server-name>。证书签发完成后,将证书和完整链保存到受保护目录:
install -o root -g root -m 0644 server.crt /etc/ssl/certs/server.crt
install -o root -g root -m 0644 ca-chain.crt /etc/ssl/certs/ca-chain.crt
chmod 0600 /etc/ssl/private/server.key
不要把私钥通过文章、截图或日志公开。
4.3 配置 HTTPS 站点
编辑站点配置:
vi /etc/nginx/sites-available/default
基础 HTTPS 配置示例:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name <server-name>;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
配置完成后先检查语法:
nginx -t
systemctl reload nginx
4.4 配置静态网页和访问日志
创建测试页面:
cat > /var/www/html/index.html <<'EOF'
Nginx HTTPS test page
EOF
chown -R www-data:www-data /var/www/html
chmod 0755 /var/www/html
在 /etc/nginx/nginx.conf 的 http 块中定义访问日志格式,并按站点保存日志:
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
不要把日志文件权限设置为 777;按 Nginx 服务账号和日志轮转策略管理权限。
4.5 隐藏 Nginx 版本号
在 http 块中加入:
server_tokens off;
检查配置并重载:
nginx -t
systemctl reload nginx
客户端可以通过响应头确认版本号是否隐藏:
curl -kI https://<server-name>/
-k 只用于实验环境证书未被客户端信任的情况,生产环境应正确部署证书链并去掉 -k。
4.6 配置 HTTP 自动跳转 HTTPS
将 80 端口的站点配置为永久跳转:
server {
listen 80;
listen [::]:80;
server_name <server-name>;
return 301 https://$host$request_uri;
}
检查并重载:
nginx -t
systemctl reload nginx
curl -I http://<server-name>/
响应应为 301,并且 Location 保留原始请求路径和查询参数。
4.7 配置 Nginx 反向代理 HTTPS 后端
在代理服务器上配置后端地址。示例将请求转发到 <backend-server>:
server {
listen 443 ssl;
server_name <proxy-server-name>;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
location / {
proxy_pass https://<backend-server>;
proxy_ssl_server_name on;
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;
}
}
如果后端证书由内部 CA 签发,应配置可信 CA,而不是关闭校验:
proxy_ssl_trusted_certificate /etc/nginx/ca/backend-ca.pem;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
代理配置示例截图:


检查并重载:
nginx -t
systemctl reload nginx
curl -kI https://<proxy-server-name>/
4.8 让后端记录真实客户端 IP
后端 Apache 可在日志格式中记录 Nginx 传递的头部:
LogFormat "%{X-Forwarded-For}i %h %l %u %t \\"%r\\" %>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" proxy_combined
后端 Nginx 可同时记录 TCP 来源和代理头部:
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
后端日志配置截图:



4.9 配置页面缓存(按需启用)
只对确定无登录态、无个性化数据的 GET/HEAD 页面启用缓存:
http {
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2
keys_zone=proxycache:20m
inactive=120s
max_size=1g;
server {
listen 80;
server_name <cache-proxy-name>;
location / {
proxy_pass https://<backend-server>;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache proxycache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid any 1m;
add_header X-Cache-Status $upstream_cache_status always;
}
}
}
配置缓存目录属主后检查:
mkdir -p /var/cache/nginx/proxy_cache
chown -R www-data:www-data /var/cache/nginx/proxy_cache
nginx -t
systemctl reload nginx
5. 验证结果
5.1 服务、配置和端口
nginx -t
systemctl is-active nginx
systemctl status nginx –no-pager
ss -lntup | grep -E ':80|:443'
Nginx 应处于 active 状态,语法检查返回 successful,并监听实际使用的 80/443 端口。
5.2 验证 HTTP 跳转和 HTTPS 响应
curl -I http://<server-name>/
curl -I https://<server-name>/
curl -sS -D- https://<server-name>/ -o /tmp/nginx-body.txt
HTTP 应返回 301/302 并指向 HTTPS;HTTPS 应返回预期业务状态码。证书未被客户端信任时仅在实验中临时使用 curl -k,生产环境应修复证书链。
5.3 验证版本隐藏和反向代理
curl -sS -k -D- https://<server-name>/ -o /dev/null | grep -i '^Server:'
curl -sS -k https://<proxy-server-name>/
tail -n 50 /var/log/nginx/access.log
响应头不应暴露具体 Nginx 版本;代理返回后端内容,访问日志能够记录请求和状态码。真实客户端 IP 的判断要结合 Nginx 与后端日志,不要只看后端 $remote_addr。
5.4 验证缓存状态
curl -sS -D- http://<cache-proxy-name>/ -o /dev/null | grep -i '^X-Cache-Status:'
curl -sS -D- http://<cache-proxy-name>/ -o /dev/null | grep -i '^X-Cache-Status:'
第二次请求出现 HIT 才说明命中缓存;如果返回 MISS、BYPASS 或没有响应头,检查缓存规则、请求方法、响应头和是否携带登录 Cookie。
5.5 验证日志和故障信息
tail -n 50 /var/log/nginx/error.log
journalctl -u nginx -n 50 –no-pager
出现 4xx/5xx 时,结合 Nginx 错误日志、后端日志、DNS、证书和代理连通性定位实际失败层级。
6. 常见问题排查
• **Nginx 启动失败**:先执行 nginx -t,检查括号、分号、证书路径和重复监听配置。
• **HTTP 没有跳 HTTPS**:检查 80 端口是否命中目标 server_name,确认 return 301 位于正确的 server 块。
• **HTTPS 证书错误**:检查域名、SAN、证书链、私钥匹配关系和客户端信任链;不要用 curl -k 掩盖生产问题。
• **反向代理 502/504**:从 Nginx Server 执行 curl 访问后端,检查后端端口、DNS、TLS/SNI、路由和防火墙。
• **后端看到的是代理 IP**:确认 X-Forwarded-For 配置和后端日志格式;只对可信代理启用真实 IP 解析。
• **版本号仍显示**:确认 server_tokens off 位于 http、server 或 location 有效上下文,并执行 reload 后重新请求。
• **缓存导致旧页面**:检查 X-Cache-Status、缓存键、缓存有效期、Cookie 和响应头;配置变更后按需清理缓存。
• **日志文件无法写入**:检查 /var/log/nginx 权限、日志轮转和磁盘空间,不要直接放开 777 权限。
网硕互联帮助中心





评论前必须登录!
注册