本文目录:
1. nginx的反向代理功能
1.1 正向代理和反向代理
1.2 配置简单的反代实验
1.3 使用upstream模块实现分组反向代理
1.4 ngx_http_proxy_module模块
1.4.1 指令及其意义
1.4.2 proxy_pass
1.4.3 proxy_set_header
1.5 ngx_http_upstream_module模块
1.6 反向代理的各种情况
1.7 nginx代理memcached
2. nginx自带的缓存功能
正向代理是众多内网客户机上网访问互联网上的网站时,将所有的请求交给内网前面处于公网上的"管家"服务器,由"管家"服务器代为请求想要访问的web服务器,然后将得到的结果缓存下来并提供给客户端,这是正向代理。"管家"服务器称为正向代理服务器。
反向代理是客户端访问web服务器时,请求发送到真实的web服务器的前端"助手"服务器上,由"助手"服务器决定将此请求转发给哪个真实的web服务器,外界客户端以为"助手"服务器就是真实的web服务器,而实际上它不是,也不需要安装任何web程序。"助手"服务器称为反向代理服务器。
nginx是一个优秀的反向代理服务程序,通过反向代理可以实现负载均衡的效果。因为是通过反向代理实现的负载均衡,所以nginx实现的是七层负载均衡。它能够识别http协议,根据http报文将不同类型的请求转发到不同的后端web服务器上。后端的web服务器称为"上游服务器",即upstream服务器。
实际上,nginx和php-fpm结合的时候,指令fastcgi_pass实现的也是反向代理的功能,只不过这种代理功能是特定的功能,只能转发给php-fpm。
nginx的反向代理有几种实现方式:
仅使用模块ngx_http_proxy_module实现简单的反向代理。指令为proxy_pass。
使用fastcgi模块提供的功能,反向代理动态内容。指令为fastcgi_pass。
使用ngx_http_memcached_module模块提供的功能,反向代理memcached缓存内容,指令为memcached_pass。
结合upstream模块实现更人性化的分组反向代理。
1.2 配置简单的反代实验实验环境如下图:
反向代理服务器nginx-proxy(192.168.100.29)的配置。由于是做代理,所以配置文件的location段不再需要root、index等指令,只需几个和代理相关的指令即可。
server { listen 80; server_name ; location ~ \.(png|jpg|jpeg|bmp|gif)$ { proxy_pass :80; } location / { proxy_pass :80/; } location ~ \.(php|php5)$ { proxy_pass :80; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }提供动态服务的nginx服务器(192.168.100.25)的配置如下。
server { listen 80; server_name ; location / { root /www/longshuai/; index index.php index.html index.htm; } location ~ \.php$ { root /php/; fastcgi_pass 192.168.100.27:9000; fastcgi_index test.php; include fastcgi.conf; } }其中php-fpm服务器(192.168.100.27)上的/www/longshuai/index.php内容如下:
<h1>page from php-fpm</h1> <?php phpinfo(); ?>LB1(192.168.100.28)和LB2(192.168.100.30)的web程序都是httpd。其中作为一般静态web服务器的LB2的配置文件没有任何修改,它的/var/www/html/index.html的内容如下:
<h1>LB2:static</h1>作为图片服务器的LB1在配置文件中添加了如下几行。且其/var/www/html/下有一个图片文件a.png。
<Files ~ "\.(png|jpeg|jpg|bmp|gif)"> Order allow,deny Allow from all </Files>经过以上的配置,可以实现如下图的功能。当访问的时候,任意以php结尾的文件请求都转发给nginx再由nginx交由php-fpm处理;任意以图片格式结尾(png/jpg/jpeg/bmp/gif)的请求都转发给LB1;任意非以上两种格式的请求都转发给LB2。
重载nginx-proxy/nginx/LB1/LB2上的nginx或者httpd。然后进行测试。