最近有打算研读nginx源代码,看到网上介绍nginx能够做为一个反向代理服务器完成负载均衡。因此搜罗了一些关于反向代理服务器的内容,整理综合。javascript
一 概述 php
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的链接请求,而后将请求转发给内部网络上的服务器;并将从服务器上获得的结果返回给Internet上请求链接的客户端,此时代理服务器对外就表现为一个服务器。css
一般的代理服务器,只用于代理内部网络对Internet的链接请求,客户机必须指定代理服务器,并将原本要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器可以代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。html

图1 反向代理服务器的基本原理java
二 反向代理服务器的工做原理nginx
反向代理服务器一般有两种模型,它能够做为内容服务器的替身,也能够做为内容服务器集群的负载均衡器。web
1,做内容服务器的替身 数据库
若是您的内容服务器具备必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器做为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。apache
当客户机向站点提出请求时,请求将转到代理服务器。而后,代理服务器经过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再经过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器(参见图 2)。若是内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,而后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。后端
这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的状况相对比,就算是侥幸攻击成功,做恶者充其量也仅限于访问单个事务中所涉及的信息。未经受权的用户没法访问到真正的内容服务器,由于防火墙通路只容许代理服务器有权进行访问。

图2 反向代理服务器做为内容服务器的替身
能够配置防火墙路由器,使其只容许特定端口上的特定服务器(在本例中为其所分配端口上的代理服务器)有权经过防火墙进行访问,而不容许其余任何机器进出。
2,做为内容服务器的负载均衡器
能够在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,能够利用代理服务器的高速缓存特性,建立一个用于负载平衡的服务器池。此时,代理服务器能够位于防火墙的任意一侧。若是 Web 服务器天天都会接收大量的请求,则可使用代理服务器分担 Web 服务器的负载并提升网络访问效率。
对于客户机发往真正服务器的请求,代理服务器起着中间调停者的做用。代理服务器会将所请求的文档存入高速缓存。若是有不止一个代理服务器,DNS 能够采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采起的路由每次均可能通过不一样的代理服务器。
可使用多个代理服务器来处理对一个高用量内容服务器的请求,这样作的好处是内容服务器能够处理更高的负载,而且比其独自工做时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,对内容服务器的请求数会大大降低。

图3 反向代理服务器做为负载均衡器
参考内容:
1,百度百科
2,http://www.oracle.com/technetwork/indexes/documentation/index.html
- Chapter: Nginx基本操做释疑
-
- 1. Nginx的端口修改问题
- 2. Nginx 301重定向的配置
- 3. Windows下配置Nginx使之支持PHP
- 4. Linux下配置Nginx使之支持PHP
- 5. 以源码编译的方式安装PHP与php-fpm
- 6. Nginx多站点配置的一次实践
- 7. Nginx反向代理的配置
Nginx 做为 web 服务器一个重要的功能就是反向代理。其实咱们在前面的一篇文章《Nginx多站点配置的一次实践》里,用的就是 Nginx 的反向代理,这里简单再提一下。
下面是配置 Nginx 做为 tornado 的反向代理的设置:
02 |
server 127.0.0.1:8888; |
07 |
root /root/nmapp2_venv; |
08 |
index index.py index.html; |
13 |
#if (!-e $request_filename) { |
14 |
# rewrite ^/(.*)$ /index.py/$1 last; |
18 |
location ~ /index\.py { |
19 |
proxy_pass_header Server; |
20 |
proxy_set_header Host $http_host; |
21 |
proxy_set_header X-Real-IP $remote_addr; |
22 |
proxy_set_header X-Scheme $scheme; |
Nginx 反向代理的指令不须要新增额外的模块,默认自带 proxy_pass 指令,只须要修改配置文件就能够实现反向代理。
再举一个例子吧。好比要配置后端跑 apache 服务的 ip 和端口,也就是说,咱们的目标是实现经过 http://ip:port 能访问到你的网站。
只要新建一个 vhost.conf,加入以下内容(记得修改 ip 和域名为你的 ip 和域名)。修改nginx.conf,添加 include quancha.conf 到http{}段, reload nginx就能够了。
Nginx 反向代理模板:
01 |
## Basic reverse proxy server ## |
03 |
server ip:8080; #Apache |
06 |
## Start www.nowamagic.net ## |
09 |
server_name www.nowamagic.net; |
11 |
access_log logs/quancha.access. log main; |
12 |
error_log logs/quancha.error. log ; |
14 |
index index.html index.htm index.php; |
16 |
## send request back to apache ## |
22 |
proxy_set_header Host $host; |
23 |
proxy_set_header X-Real-IP $remote_addr; |
24 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
25 |
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; |
26 |
proxy_max_temp_file_size 0; |
27 |
proxy_connect_timeout 90; |
28 |
proxy_send_timeout 90; |
29 |
proxy_read_timeout 90; |
32 |
proxy_busy_buffers_size 64k; |
33 |
proxy_temp_file_write_size 64k; |
这就完成了 Nginx 反向代理配置。
------使用过的配置
#user nobody;worker_processes 4;error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;worker_rlimit_nofile 204800;events { worker_connections 16384; multi_accept on; use epoll;}http { include mime.types; default_type application/octet-stream; log_format test166 '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"[$request_time]" "[$upstream_response_time]" ' '"[$connection]" "[$connection_requests]" ' '"$http_imei" "$http_mobile" "$http_type" "$http_key" "$cookie_sfpay_jsessionid"'; access_log logs/access.log test166; sendfile on; #tcp_nopush on; underscores_in_headers on; keepalive_timeout 65; proxy_connect_timeout 120; proxy_read_timeout 120; proxy_send_timeout 60; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_temp_path /home/temp_dir; proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; client_header_buffer_size 12k; open_file_cache max=204800 inactive=65s; open_file_cache_valid 30s; open_file_cache_min_uses 1; gzip on; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/jpg; upstream ims-oms { server 1.1.240.31:8001; } upstream anruy-tomcat { server 1.1.231.54:8080; server 1.1.231.55:8080; keepalive 40; } upstream anruy-tomcat { server 1.1.231.84:8080; server 1.1.231.85:8080; keepalive 40; } # HTTP server # server { listen 8080; server_name anruy01-sit; location ~ (etc/passwd|\.php|\.asp|win.ini)$ { deny all; } location /nginx_status { stub_status on; access_log off; } location /ims/{ proxy_pass http://ims-oms/ims/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; } location /anruy/ { proxy_pass http://anruy-tomcat/anruy/remote/interface; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host:1443; proxy_http_version 1.1; proxy_set_header Connection keep-alive; proxy_set_header Keep-Alive 600; keepalive_timeout 600; } location /anruy-front/ { proxy_pass http://anruy-tomcat/anruy-front/remote/interface; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host:1443; proxy_http_version 1.1; proxy_set_header Connection keep-alive; proxy_set_header Keep-Alive 600; keepalive_timeout 600; } location / { root html; index index.html index.htm; } # client_body_temp_path /usr/local/nginx/html/tmp; # dav_access group:rw all:r; # index index.html index.htm *.jsp ; # proxy_set_header X-Real-IP $remote_addr; # client_max_body_size 100m; }}