D8-Nginx-Proxy+Balance
内容:
1 HTTP代理模块(HTTP Proxy)
2 HTTP负载均衡模块
3 例子:Nginx 代理 VMware Vsphere Web Client (Https/SSL)
1 HTTP代理模块(HTTP Proxy)
这个模块可以转发请求到其他的服务器。
HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样浏览器(nginx?)就可以为浏览器处理keepalive。
如下例:
- location / {
- proxy_pass http://localhost:8000;
- proxy_set_header X-Real-IP $remote_addr;
- }
注意当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。
//proxy_pass
语法:proxy_pass URL
默认值:no
使用字段:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:
- proxy_pass http://localhost:8000/uri/;
或者一个unix socket:
- proxy_pass http://unix:/path/to/backend.socket:/uri/;
路径在unix关键字的后面指定,位于两个冒号之间。
注意:HTTP Host头没有转发,它将设置为基于proxy_pass声明,例如,如果你移动虚拟主机example.com到另外一台机器,然后重新配置正常(监听example.com到一个新的IP),同时在旧机器上手动将新的example.comIP写入/etc/hosts,同时使用proxy_pass重定向到http://example.com, 然后修改DNS到新的IP。
当传递请求时,Nginx将location对应的URI部分替换成proxy_pass指令中所指定的部分,但是有两个例外会使其无法确定如何去替换:
location通过正则表达式指定;
在使用代理的location中利用rewrite指令改变URI,使用这个配置可以更加精确的处理请求(break):
- location /name/ {
- rewrite /name/([^/] +) /users?name=$1 break;
- proxy_pass http://127.0.0.1;
- }
这些情况下URI并没有被映射传递。
此外,需要标明一些标记以便URI将以和客户端相同的发送形式转发,而不是处理过的形式,在其处理期间:
两个以上的斜杠将被替换为一个: ”//” – ”/”;
删除引用的当前目录:”/./” – ”/”;
删除引用的先前目录:”/dir /../” – ”/“。
如果在服务器上必须以未经任何处理的形式发送URI,那么在proxy_pass指令中必须使用未指定URI的部分:
- location /some/path/ {
- proxy_pass http://127.0.0.1;
- }
在指令中使用变量是一种比较特殊的情况:被请求的URL不会使用并且你必须完全手工标记URL。
这意味着下列的配置并不能让你方便的进入某个你想要的虚拟主机目录,代理总是将它转发到相同的URL(在一个server字段的配置)
- location / {
- proxy_pass http://127.0.0.1:8080/VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot;
- }
解决方法是使用rewrite和proxy_pass的组合:
- location / {
- rewrite ^(.*)$ /VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot$1 break;
- proxy_pass http://127.0.0.1:8080;
- }
这种情况下请求的URL将被重写, proxy_pass中的拖尾斜杠并没有实际意义。
如果需要通过ssl信任连接到一个上游服务器组,proxy_pass前缀为 https://,并且同时指定ssl的端口,如:
- upstream backend-secure {
- server 10.0.0.20:443;
- }
- server {
- listen 10.0.0.1:443;
- location / {
- proxy_pass https://backend-secure;
- }
- }
2 HTTP负载均衡模块
这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))如下例:
- upstream backend {
- server backend1.example.com weight=5;
- server backend2.example.com:8080;
- server unix:/tmp/backend3;
- }
- server {
- location / {
- proxy_pass http://backend;
- }
- }
//ip_hash
语法:ip_hash
默认值:none
使用字段:upstream
这个指令将基于客户端连接的IP地址来分发请求。
哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”,如下例:
- upstream backend {
- ip_hash;
- server backend1.example.com;
- server backend2.example.com;
- server backend3.example.com down;
- server backend4.example.com;
- }
//server
语法:server name [parameters]
默认值:none
使用字段:upstream
指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。
weight = NUMBER - 设置服务器权重,默认为1。
max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。
fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。
down - 标记服务器处于离线状态,通常和ip_hash一起使用。
backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。
示例配置
- upstream backend {
- server backend1.example.com weight=5;
- server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
- server unix:/tmp/backend3;
- }
注意:如果你只使用一台上游服务器,nginx将设置一个内置变量为1,即max_fails和fail_timeout参数不会被处理。
结果:如果nginx不能连接到上游,请求将丢失。
解决:使用多台上游服务器。
//upstream
语法:upstream name { … }
默认值:none
使用字段:http
这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重,默认为1。
示例配置
- upstream backend {
- server backend1.example.com weight=5;
- server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
- server unix:/tmp/backend3;
- }
请求将按照轮询的方式分发到后端服务器,但同时也会考虑权重。
在上面的例子中如果每次发生7个请求,5个请求将被发送到backend1.example.com,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。
3 例子:
//代理 vmware vsphere web client 为例
URL https://client.test.com/vsphere-client/
过程 client -> nginx 443 -> tomcat 443
1 nginx proxy
rhel5.4 192.168.57.71/10.0.100.71
2 tomcat web client server
windows 2k3 server 10.0.100.83
#nginx 代码
- #nginx 代理相关参数
- proxy_redirect off;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- client_max_body_size 50m;
- client_body_buffer_size 256k;
- proxy_connect_timeout 30;
- proxy_send_timeout 30;
- proxy_read_timeout 60;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
- proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
- proxy_max_temp_file_size 128m;
- proxy_store on;
- proxy_store_access user:rw group:rw all:r;
- upstream vsphere_web_client
- {
- server 10.0.100.83:443 weight=1 max_fails=2 fail_timeout=30s;
- }
- server {
- listen 443 ssl;
- server_name client.test.com;
- access_log /data/logs/client.test.com/access.log;
- error_log /data/logs/client.test.com/error.log;
- ssl_certificate ssl/server.crt;
- ssl_certificate_key ssl/server.key;
- keepalive_timeout 60;
- if ($host !~ "client.test.com")
- {
- return 403;
- }
- location /
- {
- proxy_pass https://vsphere_web_client;
- }
- }
//nginx ssl 可以参考这里
PS:proxy_pass 代理得不到客户端ip 地址问题
//nginx 日志格式
- log_format access '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" $http_x_forwarded_for';
#nginx 代码
- location ^~ /fashion/pic/
- {
- proxy_pass http://blog.test.com/;
- }
#nginx 日志
- 192.168.57.75 - - [21/Aug/2012:11:00:10 +0800] "GET / HTTP/1.0" 200 6153 "-" \
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1"\
- - #注意这里
//添加proxy_set_header 语句
#nginx 代码
- location ^~ /fashion/pic/
- {
- proxy_pass http://blog.test.com/;
- proxy_set_header X-Forwarded-For $remote_addr;
- }
#nginx 日志
- 192.168.57.75 - - [21/Aug/2012:11:52:40 +0800] "GET / HTTP/1.0" 200 6156 "-" \
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" \
- 192.168.4.33 #注意这里
参考
HTTP代理模块(HTTP Proxy)
HTTP负载均衡模块
结束
更多请:
linux 相关 37275208
vmware 虚拟化相关 166682360