nginx常用代理配置,Nginx常用代理配置

因为业务系统需求,必要对web服务作nginx代理,在相连的尝尝进度中,简单总计了壹晃大面积的nginx代理配置。

Nginx常用代理配置

因为事情连串必要,要求对web服务作nginx代理,在频频的品尝进度中,简单总计了眨眼间间科学普及的nginx代理配置。

一. 最简反向代理配置

在http节点下,使用upstream配置服务地点,使用server的location配置代理映射。

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/。

亟待注意的是,若是依据如下配置:

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/**my**。这是因为proxy\_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。

一. 最简反向代理配置

在http节点下,使用upstream配置服务地点,使用server的location配置代理映射。

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/。

亟待专注的是,假诺根据如下配置:

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/my。这是因为proxy\_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。

2. 重定向报文代理

不怕配置了nginx代理,当服务重临重定向报文时(http
code为30一或30二),会将重定向的指标url地址放入http
response报文的header的location字段内。用户浏览器收到重定向报文时,会分析出该字段并作跳转。此时新的央浼报文将平素发送给服务地方,而非nginx地址。为了能让nginx拦截此类请求,必须修改重定向报文的location消息。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}

使用proxy_redirect能够修改重定向报文的location字段,例子中会将有所的根路径下的url代理到nginx的/my/路径下重回给用户。比如服务重临的重定向报文的location原始值为/login,那么通过nginx代理后,用户收到的报文的location字段为/my/login。此时,浏览器将会跳转到nginx的/my/login地址进行访问。

亟需专注的是,服务重回的重定向报文的location字段有时会填写相对路径(包涵服务的ip/域名和端口),有时候会填写相对路径,此时亟待遵照实况举行辨别。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect http://my_server/ http://$host:$server_port/my/;
}

上述配置便是将my_server服务的根路径下的拥有途径代理到nginx地址的/my/路径下。当nginx配置唯有多个server时,http://$host:$server_port前缀可以简简单单。

2. 重定向报文代理

尽管配置了nginx代理,当服务重返重定向报文时(http
code为301或30贰),会将重定向的对象url地址放入http
response报文的header的location字段内。用户浏览器收到重定向报文时,会分析出该字段并作跳转。此时新的请求报文将一贯发送给服务地点,而非nginx地址。为了能让nginx拦截此类请求,必须修改重定向报文的location音信。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}

使用proxy_redirect能够修改重定向报文的location字段,例子中会将兼具的根路径下的url代理到nginx的/my/路径下回到给用户。比如服务再次来到的重定向报文的location原始值为/login,那么通过nginx代理后,用户接受的报文的location字段为/my/login。此时,浏览器将会跳转到nginx的/my/login地址进行走访。

须要留意的是,服务重临的重定向报文的location字段有时会填写相对路径(包蕴服务的ip/域名和端口),有时候会填写相对路径,此时亟待基于实际情形展开识别。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect http://my_server/ http://$host:$server_port/my/;
}

上述配置便是将my_server服务的根路径下的具有路线代理到nginx地址的/my/路径下。当nginx配置唯有1个server时,http://$host:$server_port前缀可以不难。

三. 报文数据替换

应用nginx代理最牛(dan)逼(sui)的情形正是http响应报文内写死了劳务地方或web相对路径。写死服务地点的事态相比较少见,但也偶尔存在。最困难的是写死了web相对路径,越发是相对路径都未曾集体前缀。举个例子来说:

一般的web页面会含有如下类似路径:

  • /public:用于静态页面财富,如js脚本/public/js,样式表/public/css,图片/public/img等。
  • /static:和/public类似。
  • /api:用于后台服务API接口。
  • /login:用于登录验证。
  • 其他。

对于如此的劳务,大概的代理配置如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /login/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /public/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /api/ {
    proxy_pass http://my_server/api;
    proxy_set_header Host $host:$server_port;
}

由于web页面或静态能源内写死了看似的相对路径,那么对于用户来说,通过页面内的链接举办跳转时,都会呈请到nginx服务对应的不二等秘书籍上。壹旦存在另二个劳务也含有类似的路径,也必要nginx举行代理,那么争执就涌出了:做客nginx的同二个门路下的伸手毕竟转载给哪3个劳动?

要化解那几个标题,必须在用户收到报文前,将报文的数码中包蕴的相对路径都加上统一的前缀,如/my/public,/my/api,/my/login,那样nginx代理配置则能够简化为:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /other/ {
    proxy_pass http://other_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /other/;
}

nginx的ngx_http_sub_module模块提供了就如的报文数据替换功用,该模块暗中同意不会安装,要求在编写翻译nginx时添加–with-http_sub_module参数,或许间接下载nginx的rpm包。

使用sub_filter对数码包进行替换的语法如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    sub_filter 'href="/' 'href="/my/';
    sub_filter 'src="/' 'src="/my/';
    sub_filter_types text/html;
    sub_filter_once  off;
}

上述配置会将/my/下的全部响应报文内容的href=”/替换为href=”/my,以及src=”/替换为src=”/my,即为全体的相对路径添加公共前缀。

留神,若是要求陈设多个sub_filter,必须确认保证nginx是1.9.4版本之上的。

三. 报文数据替换

运用nginx代理最牛(dan)逼(sui)的情况便是http响应报文内写死了劳动地点或web相对路径。写死服务地点的场所相比较少见,但也偶尔存在。最辛勤的是写死了web相对路径,特别是相对路径都不曾集体前缀。举个例子来说:

一般的web页面会蕴藏如下类似路径:

  • /public:用于静态页面财富,如js脚本/public/js,样式表/public/css,图片/public/img等。
  • /static:和/public类似。
  • /api:用于后台服务API接口。
  • /login:用于登录验证。
  • 其他。

对于如此的劳务,大概的代办配置如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /login/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /public/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /api/ {
    proxy_pass http://my_server/api;
    proxy_set_header Host $host:$server_port;
}

是因为web页面或静态能源内写死了接近的绝对路径,那么对于用户来说,通过页面内的链接实行跳转时,都会呈请到nginx服务对应的门径上。一旦存在另一个劳务也饱含类似的门道,也必要nginx举行代理,那么争持就涌出了:访问nginx的同三个门路下的请求毕竟转载给哪五个劳务?

要化解这么些难点,必须在用户收到报文前,将报文的多寡中隐含的相对路径都加上统一的前缀,如/my/public,/my/api,/my/login,那样nginx代理配置则足以简化为:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /other/ {
    proxy_pass http://other_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /other/;
}

nginx的ngx_http_sub_module模块提供了就像是的报文数据替换功用,该模块私下认可不会安装,需求在编写翻译nginx时添加–with-http_sub_module参数,可能直接下载nginx的rpm包。

使用sub_filter对数码包举行交换的语法如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    sub_filter 'href="/' 'href="/my/';
    sub_filter 'src="/' 'src="/my/';
    sub_filter_types text/html;
    sub_filter_once  off;
}

上述配置会将/my/下的全体响应报文内容的href=”/替换为href=”/my,以及src=”/替换为src=”/my,即为全部的相对路径添加公共前缀。

小心,要是供给安顿三个sub_filter,必须确定保证nginx是1.9.四本子之上的。

4. 总结

即使如此,sub_filter也无法一举成功全数标题。最近盛行的js框架都会有机动渲染url的功力,相当于说,很多相对路径并非写死在静态页面内,也是由js代码框架动态变化的,面对这么的图景,sub_filter也是无能为力了。对于这么的情事,我不得不由衷地告诫,照旧安静的改代码吧!

4. 总结

尽管如此,sub_filter也不能够一举成功全数毛病。如今风行的js框架都会有机动渲染url的成效,也正是说,很多相对路径并非写死在静态页面内,也是由js代码框架动态变化的,面对那样的处境,sub_filter也是无能为力了。对于如此的情状,作者不得不由衷地劝导,依旧安静的改代码吧!

更加多Nginx相关课程见以下内容:

CentOS 六.二实战布置Nginx+MySQL+PHP

使用Nginx搭建WEB服务器

搭建基于Linux陆.3+Nginx一.二+PHP5+MySQL5.5的Web服务器全经过

CentOS 六.3下Nginx质量调优

CentOS 6.3下配置Nginx加载ngx_pagespeed模块

CentOS 6.肆安装配备Nginx+Pcre+php-fpm

Nginx安装配备利用详细笔记

Nginx日志过滤 使用ngx_log_if不记录特定日志

Nginx 的详尽介绍:请点那里
Nginx 的下载地址:请点那里

正文永久更新链接地址:

http://www.bkjia.com/Linux/1145335.htmlwww.bkjia.comtruehttp://www.bkjia.com/Linux/1145335.htmlTechArticleNginx常用代理配置
因为工作系统要求,须要对web服务作nginx代理,在时时刻刻的尝试进程中,简单总计了一下广大的nginx代理配置。

  1. 最简反向…