Nginx常见场景代理转发配置
注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系!
并注明来源: Nginx常见场景代理转发配置_阿飞的专栏-CSDN博客_nginx 代理转发配置
在这里分享的不是nginx的配置文件说明,而是nginx常用的转发代理配置(比如线上多域名配置,后端各种转发代理配置以及较为复杂的代理转发配置),另外还会对常用的转发代理参数配置进行说明。
nginx配置文件说明请参考:
1)http://www.cnblogs.com/hunttown/p/5759959.html
2)http://www.jianshu.com/p/1b44b5142155
一、代理转发
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/bao19901210/article/details/52537279(感谢作者分享)
三、小结
1)通过本文,应该比较清楚的描述了一级、二级域名的配置;
2)通过各种场景,应该描述清楚了location各种情况的转发配置;
3)引用其他文章,讲解了部分参数的含义
4)各种复杂的情况,还需要根据具体的业务及需求进行配置,这里的例子相对都比较简单。
Nginx常见场景代理转发配置相关推荐
- 通过 Nginx 代理转发配置实现跨域(API 代理转发)
通过 Nginx 代理转发配置实现跨域(API 代理转发) 阅读 2285 收藏 119 2017-04-08 原文链接:www.thinktxt.com 1元视频体验视频通话10000分钟cloud ...
- Nginx使用场景及相关配置
Nginx使用场景及相关配置 1 基本配置介绍 1.1 配置文件结构 1.2 各配置块说明 2 nginx常用命令 2.1常用命令 2.2 详解及示例 2.2.1 验证配置是否正确 2.2.2 查看N ...
- Nginx(proxy_pass代理转发详解)
proxy_pass 代理转发, 不过要注意的是url后面时候有跟 / 这个,如果有的话就是绝对的根目录,没有的话就是相对路径,并把匹配到的带上. 例子: 比如访问 : http://127.0.0. ...
- Nginx笔记-反向代理中配置WebSocket及设置超时
这里贴下配置: ... server{listen 8888;server_name MyWeb;location / {proxy_pass http://xxx.xx.xx.xxx:xxxx;}l ...
- Nginx的反向代理的配置
1.linux下的方向代理(前提域名和P已经映射好了的) 在linux中的输入命令:whereis nginx 查看当前nginx的安装目录 显示 nginx: /usr/local/nginx 命令 ...
- Nginx的反相代理, 负载均衡
转自 http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- node+express+http-proxy-middleware代理转发
node+express+http-proxy-middleware代理转发 @(node代理转发)[http-proxy|node实现前后端分离|] 文章,欢迎进入我的博客:www.jaxqin.c ...
- Nginx:配置 proxy_pass 代理转发
在nginx中配置proxy_pass代理转发时: 如果在proxy_pass后面的url加/,表示绝对根路径: 如果没有/,表示相对路径,把匹配的路径部分也给代理走. 1.实例说明: 假设下面四种情 ...
- 阿里云服务器安装并配置nginx代理转发请求
阿里云服务器安装并配置nginx代理转发请求 下载nginx安装包,或者上传nginx安装包,此处我用的是Xmanager工具从本地上传了一个nginx安装包. 安装依赖库 yum -y instal ...
最新文章
- mysql设置php权限_MYSQL新建用户并设置权限
- html to txt研究
- 2019 年 8 月编程语言排行榜,C#重回增长之路
- php websocket 连接已断开连接,客户端websocket 无法连接上PHP socket问题
- java 中subtract的用法_java中BigDecimal加减乘除基本用法
- python100例详解-Python类和实例详解
- 一纬度横直线等于多公里_【高中物理】必修一知识点总结
- 初步实现免费下载百度文库word文档(只限纯文本文档)----------------(浏览器控制台执行js代码)
- mindoc mysql_MinDoc文档管理系统搭建
- HTML5制作诗歌锦集,【热门】诗歌作文锦集六篇
- 松山湖云计算机中心,【东莞唯一】中科院云计算中心被点赞,松山湖又又又亮了!...
- Python量化分析应该怎么做 ?
- 教你同时分析圆通快递多个单号的物流情况
- c 与易语言程序间通信,易语言与三菱PLC通信-FX系列
- 世界上第一个bug的发现者——被誉为“COBOL 之母”的葛丽丝 · 霍普。
- IDC:微软Windows将于2007年失去统治地位
- Mac系统自带中文输入法英文标点
- Tensorflow2.0之用循环神经网络生成周杰伦歌词
- SSM框架实战详细教程(十四)贯穿项目实战之三层架构
- cuda10.1安装