当前位置:首页 > 技术文章 > 正文内容

nginx代理常用配置

arlanguage5个月前 (12-13)技术文章33

1. 最简反向代理配置

在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为301或302),会将重定向的目标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前缀可以省略。

3. 报文数据替换

使用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版本之上的。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/131.html

分享给朋友:

“nginx代理常用配置” 的相关文章

Nginx基础知识之rewrite反向代理规则

location ~ .*\.(sh|bash)?$ {return 403;}~是区分大小写的匹配。? 是匹配前面的字符零次或者一次。状态码403是Fobidden,表示服务器已经理解请求,但是拒绝执行它。访问的URL以.sh或.bash结尾,则返回状态码403。403表示服务器已经理解请求,但是...

轻松搭建基于 Serverless 的 ThinkPHP 应用

ThinkPHP 是什么?ThinkPHP 是一个免费开源的,快速、简单的面向对象的轻量级 PHP 开发框架,是为了敏捷 WEB 应用开发和简化企业应用开发而诞生的。ThinkPHP 从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,更注重易用性。遵循 Apache2 开源许可...

如何在本地部署WEB开发(PHP)环境

目前很多网站程序是基于PHP语言,比如比较有名的开源程序WordPress、Discuz、DedeCMS...对于大多初学者来说,本地部署WEB环境(PHP/ASP+Apache/Nginx+Mysql),一个一个安装调试是一件很麻烦的事。所以这次分享一下如何在本地快速搭建WEB环境!考虑到大家大多...

Linux这17个操作技巧是每个运维工程师应知必会的吧?

今天跟大家分享17个linux运维中常用的操作技巧!掌握好这些技巧,或许某一天能够让老板给你涨工资!1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录:find . -name “*.tar” -exec mv {}./backup/ ;?注解:find –name 主要用于查找某个文件名...

配置Nginx TCP转发

Nginx一般用在HTTP的转发,TCP的转发大都会使用HAProxy。工作中遇到一个需求,用到了Nginx服务作为TCP转发。场景是这样,数据采集设备通过公网将数据推送到后端应用服务,服务部署在业主的IDC中,不能对外暴露,有现成的Nginx服务器部署在DMZ中,充当数据转发服务,拓扑如下:网络拓...

不想被恶意访问?SpringBoot 的 IP 白名单限制了解一下!

前言在项目开发中,我们多少都会遇到要对请求访问IP做限制,允许哪些IP是可以访问系统。对于前后分离项目有两种方案,第一种是在Nginx服务中进行配置IP白名单,第二种是项目接口中进行白名单控制,例如在spring boot接口中进行白名单限制。方案一:Nginx服务器中配置IP白名单限制如果想在ng...