云计算百科
云计算领域专业知识百科平台

Debian Nginx 配置实战:HTTPS、重定向、反向代理与真实 IP

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;

代理配置示例截图:

image1

image2

检查并重载:

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;

后端日志配置截图:

image3

image4

image5

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 权限。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Debian Nginx 配置实战:HTTPS、重定向、反向代理与真实 IP
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!