nginx反向代理踩坑记录
前言
因为业务需要,我研究了一下nginx的反向代理。
过程中遇到一些坑,在此记录下,以备检索。
例子
目录相关问题
01
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
}
}
通过该配置,访问nginx地址http://10.0.0.1:80/my
的请求会被转发到my_server
服务地址http://10.0.0.2:8080/
。
02
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass http://my_server;
proxy_set_header Host $host:$server_port;
}
}
需要注意的是,如果按照02配置:
那么,访问nginx地址http://10.0.0.1:80/my
的请求会被转发到my_server
服务地址http://10.0.0.2:8080/my
。这是因为proxy_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。
总结:
Nginx配置proxy_pass转发的 / 路径问题
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意 proxy_pass 后的 url 最后的 / :
当加上了 /,相当于绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理走
如果没有 /,相当于相对路径,则会把匹配的路径部分也给代理走
内容替换相关问题
nginx 默认进行text/html
类型的内容替换。
以下是相关函数的摘录:
2.1
sub_filter
指令:sub_filter
string
(原字符串)replacement
(用于替换的字符串);用于设置需要使用说明字符串替换说明字符串.
string
是要被替换的字符串,replacement
是 新的字符串,它里面可以带变量。2.2
sub_filter_last_modified
指令:sub_filter_last_modified on | off
;用于设置网页内替换后是否修改 可在
nginx.conf
的http
,server
,location
三个位置配置使 用,默认值是off
;2.3
sub_filter_once
指令:sub_filter_once on | off
;用于设置字符串替换次数,默认只替换一次。如果是
on
,默认只替换第一次匹配到的到字 符,如果是off
,那么所有匹配到的字符都会被替换;2.4
sub_filter_types
指令:sub_filter_types *
用于指定需要被替换的
MIME
类型,默认为“text/html
”,如果制定为*
,那么所有的;说明:以上指令可在
nginx.conf
的http
,server
,location
三个位置配置使用;