当前页面使用了 MIP 加速。如需访问完整页面,App-Scope 还准备了 RWD 版 »

Nginx 学习笔记 (2) - 反向代理的基本配置暨参数详解


Part II. 基本配置

⚠️ 可以用 vim 编辑文件。按 i 进插入模式,Ctrl + [ 回命令模式,:q 放弃修改,:wq 保存且退出。

1) 编辑配置。Nginx 配置文件的路径,可透过 nginx -t 命令找出;

vim /usr/local/nginx/conf/nginx.conf

2) nginx.conf 的内容相当庞杂,为日后维护方便,建议拆分出 server block,即在 http block 引用外部配置文件;

http {
    ...
    include server.conf;
    ...
}

3) 以反代 www.example.com 为例,创建并编辑 server.conf。在本例中 $TARGET 填了域名,但 proxy_pass 遇有变量是不会走系统 /etc/hosts/etc/resolv.conf,而是走 resolver 指定的 DNS 服务器,好处是可以实现域名的动态解析。yourdomain.com 应该换成您自己的主机名。

出于防止跨站攻击和反盗链的目的,对方一般会校验 Referer,不是他们的域名统统返回 403 (另请参阅 反制手段 4 @ Nginx 学习笔记 (5) - 被反代被镜像了怎么办?),作出修改可绕过此限制。至于改不改 Host,Nginx 学习笔记 (a1) - proxy_set_header 的默认值 有更多介绍。

X-Real-IP 用于记录客户端的 IP (但不一定是真实的, 还有正代这个概念),X-Forwarded-For 则反映链路信息,比如经过多少层代理等,虽说以上两字段的伪造相当容易,投票刷票即属一例,毕竟作弊在应用层是难免的。

借由传递客户端的 Set-Cookie,既可反代又不影响注册登录等功能运作,即解决 Cookie 丢失的问题。可能还需要修改 Cookie 的 Domain 属性,摆平跨域的麻烦。

server {
    listen 80;
    server_name yourdomain.com;
        
    location / {
        resolver 8.8.8.8;
        set $TARGET 'www.example.com';
        proxy_pass http://$TARGET;

        # proxy_set_header Host $TARGET;
        proxy_set_header Referer http://$TARGET;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass_header Set-Cookie;
        # proxy_cookie_domain www.example.com yourdomain.com;
    }
}

4) 先检测配置文件语法的准确性,再动态加载 (热加载) 或重启 Nginx 以查看效果;

nginx -t && (nginx -s reload || service nginx restart)
curl -I yourdomain.com

5) 从外部访问,需要打开 firewalld 防火墙的相应端口。

firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --reload