简介
说明
本文介绍Nginx的proxy_pass的使用。
相关网址
nginx官网:Module ngx_http_proxy_module
示例
假设下面四个示例都是访问 http://192.168.1.1/proxy/test.html。
例1:ip带/
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
例2:ip不带/
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
例3:ip+path带/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html
例3:ip+path不带/
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html
概述
作用
nginx可以使用proxy_pass配置的url去替换location指定的部分。
当访问的url匹配location时,实际会被nginx转发到proxy_pass的url(不影响浏览器地址栏的url)。
建议所有的 proxy_pass 后的url都以“/”结尾。
配置语法
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
url用于设置代理服务器的协议和地址,以及uri。一般表现形式为:protocol://ip:port[uri] 或者 protocol://domain[uri]
URL末尾是否存在uri的处理逻辑不同,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
详解
url中带URI
判断方法
如果域名后面带了“/”,则表示url带了URI。比如:
• proxy_pass http://127.0.0.1/
• proxy_pass http://127.0.0.1/aaa
• proxy_pass http://127.0.0.1/aaa/
转发规则
若匹配location路径,则使用proxy_pass配置的url去替换。
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
如下图所示:使用http://127.0.0.1/remote/去替换URI中http://originhost/name/这一段
url中不带URI
判断方法
proxy_pass指定url中只有域名,比如http://127.0.0.1,则表示不带URI。
转发规则
location /some/path/ {
proxy_pass http://127.0.0.1;
}
处理后的url = proxy_pass配置的url+原始url中URI
nginx无法确认url的替换规则
nginx又细分成3类
1.location指定的是正则表达式
使用正则表达式指定location,而且这个location在locations中时,配置proxy_pass不能带URI。
2. path路径在location中使用rewrite重写了
比如
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1/test;
}
这种场景,nginx会忽略proxy_pass中配置的URL,会使用替换过的整个请求URL去请求服务器。
3.proxy_pass配置的url中带变量
比如
location /name/ {
proxy_pass http://127.0.0.1$request_uri;
}
如果proxy_pass配置的url经过变量转换后带path路径,则直接使用该url。
获得真实IP
存在的问题:经过Nginx转发后,应用程序获得的是Nginx所在服务器的ip等信息,无法获得用户的真实ip等信息。
解决方法:在Nginx进行配置,将请求header中用户的ip等信息传递给应用程序,配置示例如下(nginx.conf):
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 127.0.0.1:8080;
}
server {
# 所有IPV4的地址
listen 20000;
# 所有IPV6的地址
listen [::]:20000;
server_name abc.com;
client_max_body_size 20m;
charset utf-8;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://myapp;
}
}
}