Nginx常见场景代理转发配置

Nginx常见场景代理转发配置注意 本文出自 阿飞 的博客 如果要转载本文章 请与作者联系 并注明来源 http blog csdn net faye0412 article details 在这里分享的不是 nginx 的配置文件说明 而是 nginx 常用的转发代理配置 比如线上多域名配置 后端各种转发代理配置以及较为复杂的代理转发配置 另外还会对常用的转发代理参数配置进行说明

注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系!

并注明来源: Nginx常见场景代理转发配置_阿飞的专栏-CSDN博客_nginx 代理转发配置

在这里分享的不是nginx的配置文件说明,而是nginx常用的转发代理配置(比如线上多域名配置,后端各种转发代理配置以及较为复杂的代理转发配置),另外还会对常用的转发代理参数配置进行说明。

nginx配置文件说明请参考:

1)http://www.cnblogs.com/hunttown/p/5759959.html 

2)http://www.jianshu.com/p/1b44b

一、代理转发

nginx的代理转发主要是在server部分进行配置。如果转向到制定域名或子域名,则需要在godaddy、阿里云等域名解析中预先配置(子)域名并指定IP。本文中主要描述通配符域名的配置,这样更具有通用性。

server部分配置为:

server { listen 80; server_name *.yourdomain.com; ......

如果是https则修改listen部分即可:

listen 443 ssl;

* https配置还需要单独配置ssl部分的内容,证书不一样,配置方式也有差异,这里不做介绍。

一般情况下,我们会有如下常见的几种需求

1)指向到公司官网或其他产品网(一级域名)
每个域名单独配置一个server即可,如HTTPS的配置如下:

    server {
        listen          443 ssl;
        server_name     www.yourdomain.com; #修改为需要的一级域名即可

        access_log      logs/ssl.access.log;
        error_log       logs/ssl.error.log crit;

        include ssl_params;

        location / {
                index  index.html index.htm index.php;
                index  proxy_set_header Host $host;
                index  proxy_set_header X-Real-IP $remote_addr;
                index  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://server_cluster; #后端服务器,具体配置upstream部分即可
        }

    }

2)指向到公司内部管理系统等等(二级域名)

同1)部分的配置,只需要修改server_name部分即可:

server_name 二级域名.yourdomain.com; #修改为需要的二级域名即可

3)二级域名下多个服务转发

比如:

http://dev.yourdomain.com/nexus

http://dev.yourdomain.com/zentao

http://dev.yourdomain.com/adminsys

而后端服务可能会部署在不同的server容器中,比如tomcat、php-fpm/fastcgi、第三方服务…

server部分需要先配置第2)点部分内容,然后再配置该server下的location转发,常见location配置场景如下:

a)转发到后端Tomcat

 location /location名称/ { 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_pass http://127.0.0.1:8080/服务名/; }

tomcat的转发是很简单的了,这里不需要多说。

b)转发到php-fpm

将所有php页面的请求转给php-fpm处理:

 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

fastcgi_params配置:

fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;

注意!

配置不具备通用性,需要根据自己服务器及实际业务需要进行配置和调整。

这里的配置仅提供参考。

d)转发到第三方域名(第三方接口服务)

比如做支付时,内部系统需要通过代理转发到银联支付接口:

location /unionpay/ { proxy_set_header Host gateway.银联.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://gateway.银联.com/; }

这里的proxy_set_header Host必须配置。

4)强制http转https访问

80端口部分server配置:

server { listen 80; server_name api.yourdomain.com; location / { rewrite ^/(.*) https://api.yourdomain.com/$1 permanent ; break; } error_page 497 https://$host:$server_port$request_uri; }

当用户通过HTTP 80访问时,nginx将强制转换为HTTPS 443访问。

443端口部分server配置:

server { listen 443 ssl; server_name api.yourdomain.com; access_log logs/ssl.api_access.log; error_log logs/ssl.api_error.log crit; include ssl_params; location / { proxy_pass http://tomcat_servers/$2; proxy_set_header Host $host:443; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /v1.0/ { 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_pass http://tomcat_servers/v1.0/; proxy_cookie_path /v1.0/ /; proxy_redirect off; } }

5)后缀名定向

比如,有URL:www.abc.com/register/user.do,需要将URL定向为uuu.abc.com/register/user.do。则可以在www.abc.com节点中这样配置:

location / {
        rewrite ^(/register)/user(.*)\..*$  https://uuu.abc.com/register/user.do break;

        index  index.html index.htm;
        proxy_set_header Host $host:443;
        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;
        proxy_pass http://localhost:/;
}

6)在location中通过if-else分支,根据请求参数使用不同的proxy_pass进行转发。如:

例如url为:http://mail.yourdomain.com/abc/1?n=web01&p=8088,这里有n和p两个参数。这里的目的很简单,就是想通过n这个参数来转发到后端不同服务器的Tomcat中,比如web01转发到192.168.2.10,web02转发到192.168.2.11….这种需求,我们不可能为后端每个服务器配置一个location转发。

因此,Nginx中可以对location进行if判断,解决方案如下:

location /test/ {         proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         if ($arg_n ~* "web01") {                   proxy_pass http://192.168.2.10:$arg_p;                   break;         }         if ($arg_n ~* "web02") {                   proxy_pass http://192.168.2.11:$arg_p;                   break;         }         ....... }

其中,$arg_n表示url中的n参数,$arg_p表示url中的p参数。

最后,尤其要注意的是!proxy_pass 后的url不能有与请求的url后的路径,如proxy_pass http://192.168.2.10:$arg_p;这里不能配置为:proxy_pass http://192.168.2.10:$arg_p/abc/1…否则要报错。必须只配置到端口,并且没有斜杠/结尾。切记切记。

7)Nginx支持websocket的配置

只需要加上红色字体部分配置即可:

location /drsws/ {     proxy_set_header Host $host;     proxy_http_version 1.1;     proxy_set_header Upgrade $http_upgrade;     proxy_set_header Connection "upgrade";     proxy_set_header X-Real-IP $remote_addr;     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     ........ }

8)支持ttf|woff|woff2字体及图片文件防盗链的配置

location ~* \.(css|js|jpg|jpeg|png|gif|ico|ttf|woff|woff2|eot|svg)$ {
    root        /usr/share/nginx/html/*你的资源目录*;
    expires     30d;
    valid_referers *.yourdomain.com www.yourdomain.com dev.yourdomain.com *.baidu.com *.google.com;
    if ($invalid_referer) {
        rewrite ^/ https://www.yourdomain.com;
        #return 404;
    }
}

二、参数说明

1)proxy_set_header    X-real-ip $remote_addr;

在web服务器端获得用户的真实ip。

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

2)proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的”X-Forwarded-For”,与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的”X-Forwarded-For”部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header            X-Forwarded-For$http_x_forwarded_for时会发现,web服务器端使用request.getAttribute(“X-Forwarded-For”)获得的值是null。如果想要通过request.getAttribute(“X-Forwarded-For”)获得用户ip,就必须先使用proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

此部分内容来自:http://blog.csdn.net/bao/article/details/(感谢作者分享)

三、小结

1)通过本文,应该比较清楚的描述了一级、二级域名的配置;

2)通过各种场景,应该描述清楚了location各种情况的转发配置;

3)引用其他文章,讲解了部分参数的含义

4)各种复杂的情况,还需要根据具体的业务及需求进行配置,这里的例子相对都比较简单。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213268.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:12
下一篇 2026年3月18日 下午6:12


相关推荐

  • 取出字符串中数字的最大值

    取出字符串中数字的最大值取出字符串中数字的最大值

    2022年4月24日
    45
  • JAVA葵花宝典(基础版)

    JAVA葵花宝典(基础版)JAVA葵花宝典(基础版)20201209response.getWriter().write()和response.getWriter().print()的区别newObjectMapper().writeValueAsString();JSON.stringify()常量命名【idea技巧】IDEA给方法添加注释模板newJdbcTemplate(JDBCUtil.getDataSource()).queryForObject()20201212【idea快捷键】显示方法参数ctrl+p获取验证

    2022年7月7日
    39
  • 按钮-Button

    按钮-Button

    2021年7月25日
    78
  • 系统运维面试题

    系统运维面试题1.什么是运维?什么是游戏运维?1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络、系统、数据库、开发、安全、监控于一身的技术,运维又包括很多种,有DBA运维、网站运维、虚拟化运维、监控运维、游戏运维等等2)游戏运维又有分工,分为开发运维、应用运维(业务运维)和系统运维开发运维:是给应用运维开发运维工具和运维平台的应用运维:是给业务上线、维护和做故障排除的,用开发运维开发出来的工具给业务上线、维护、做故障

    2022年6月1日
    212
  • linux压缩到最小命令,Linux 压缩打包命令详细教程

    linux压缩到最小命令,Linux 压缩打包命令详细教程本文介绍的压缩打包命令包括 tar gzip zcat bzip2 bzcat compress cpio 等 命令参数详细说明加上实例 方便大家学习与掌握 一 tar 命令 root linux tar cxtzjvfpPN 文件与目录 参数 c 建立一个打包文件 create x 解开一个打包文件 t 查看 tarfile 里面的文件 c x t 仅能同时存在一个 z 是否

    2025年11月27日
    7
  • 使用sortablejs拖拽列表排序

    使用sortablejs拖拽列表排序sortablejs 版本 1 14 0 框架 vue UI elementimpor sortablejs 引入开始使用 我的接口 请求表格数据 fetchData getUser then res gt this list res data data this total res data count this nextTick gt 表格渲染完成 调用拖拽排序

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号