Nginx反向代理配置

Posted by Shen Chaoran on December 13, 2018

内置的全局变量

$args: 这个变量等于请求行中的参数,同$query_string
$content_length: 请求头中的Content-length字段。
$content_type: 请求头中的Content-Type字段。
$document_root: 当前请求在root指令中指定的值。
$host: 请求主机头字段,否则为服务器名称。
$http_user_agent: 客户端agent信息
$http_cookie: 客户端cookie信息
$limit_rate: 这个变量可以限制连接速率。
$request_method: 客户端请求的动作,通常为GET或POST。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口。
$remote_user: 已经经过Auth Basic Module验证的用户名。
$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme: HTTP方法(如http,https)。
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name: 服务器名称。
$server_port: 请求到达服务器的端口号。
$request_uri: 包含请求参数的原始URI,不包含主机名,/foo/bar.php?arg=baz”。
$uri: 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri: 与$uri相同。

location

  • =: 精确匹配
  • ^~: 开头匹配
  • ~: 区分大小写的正则匹配
  • ~*: 不区分大小写的正则匹配
  • /: 通用匹配

优先级: = (精确匹配) > /CMIP/index.html (完整路径) > ^~ (开头匹配) > ~, ~* (正则匹配) > /images/ (部分起始路径) > / (通用匹配)

常用的规则:

# 反向代理 tomcat
location = / {
    proxy_pass http://tomcat:8080/index
}

# 开头匹配 静态资源
location ^~ /static/ {
    root /webroot/static/;
}

# 开头匹配 后端接口
location ^~ /api/ {
    proxy_pass http://192.168.139.128:9999/api/;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
}

# 开头匹配 geoserver接口
location ^~ /geoserver/ {
    proxy_pass http://127.0.0.1:8787/geoserver/;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
}

# 正则匹配 指定后缀名文件
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

URL rewrite

rewrite 可以写在 server, location, if 三层中 ,语法:rewrite regexp replacement [flag]

location / {
    error_log logs/rewrite.log notice;
    # 注意这里要用 '' 单引号引起来,避免 {}
    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
    set $image_file $3;
    set $image_type $4;
}

# 删除前缀
location ^~ /CMIP/ {
    error_log logs/rewrite.log notice;
    rewrite '^/CMIP/(.*)' /$1;
}


location ~* \.(html|css|js|png|jpg|gis|ico|flash|images|media|woff2|svg)$ {
    root   ../../build-prod;
    index  index.html;
}

try_files

在 location 和 server 层

# 首先尝试 $uri, 找不到路径时,尝试找后面跟着的文件,找不到再报 404 not found
try_files $uri $uri/ /CMIP/index.html;

参考