dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:3467回复:4

nginx 反向代理

楼主#
更多 发布于:2013-05-13 18:04
D8-Nginx-Proxy+Balance
 
HTTP 代理模块
这个模块可以转发请求到其他的服务器
HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样nginx就可以为浏览器处理keepalive 。

#nginx 代码
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; 
  } 
}



参考
HTTP代理模块(HTTP Proxy)
HTTP负载均衡模块
  
#
结束
更多请:
linux 系统运维  37275208
vmware 虚拟化  166682360
#
本文出自 “dongnan” 博客,请务必保留此出处http://dngood.blog.51cto.com/446195/994421
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2015-04-14 16:40
nginx 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,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。

http://nginx.org/en/docs/http/load_balancing.html
#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
板凳#
发布于:2015-04-14 16:49
nginx 反向代理示例
示例:代理 vmware vsphere web client 为例
URL  https://client.test.com/vsphere-client/
过程  client -> nginx 443 -> tomcat 443
 
环境
#nginx (proxy)  
rhel5.4 192.168.57.71/10.0.100.71

#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;

         
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-p1.png




update 20121020
问题描述
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 #注意这里

#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
地板#
发布于:2016-03-01 13:54
nginx 代理示例
Q:我想实现,访问A域名,反向代理到tomcat上的另一个目录,nginx要怎么实现

A:使用proxy_pass 指令

举个栗子
访问test.ywwd.net 代理的是 ywwd.net/app-index-run?app=qqun

nginx 配置文件
location / {
     proxy_pass http://ywwd.net/app-index-run?app=qqun;
     #proxy_set_header X-Forward-For $remote_addr;
 
  }

验证

图片:nginx-proxy.png




#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
4楼#
发布于:2017-02-20 15:19
nginx 反向代理多个域名
目标
使用 nginx ,反向代理多组后端 web服务器,按照域名分发请求

环境
centos 7.3 amd64
nginx 1.6
resin 3.x

步骤
th.ywwd.net 与 irm.ywwd.net 域名解析到 nginx 反向代理IP,nginx 创建两个对应域名的 server 配置块即可:

1. 配置文件
cat proxy.conf
proxy_connect_timeout 120;
proxy_send_timeout 60;
proxy_read_timeout 90;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 64m;

server
{
    listen      80;
    server_name th.ywwd.net;
    error_page 404 /404.html;

    location ~* \.git\/$ {
         return 404;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8206;
     #proxy_redirect off;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    access_log /var/log/nginx/d.log access;
    error_log  /var/log/nginx/d-err.log;

}

server
{
    listen      80;
    server_name irm.ywwd.net;
    error_page 404 /404.html;

    location ~* \.git\/$ {
         return 404;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8207;
     #proxy_redirect off;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    access_log /var/log/nginx/irm.log access;
    error_log  /var/log/nginx/irm-err.log;

}

2. 重启服务
nginx -t && nginx -s reload

3. 验证
curl -IL irm.ywwd.net
HTTP/1.1 200 OK
Date: Mon, 13 Feb 2017 08:39:59 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache
Content-Language: en-US
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Set-Cookie: JSESSIONID=abc5G6_jJyFoWdRFoO2Ov; path=/

curl -IL d.ywwd.net
HTTP/1.1 200 OK
Date: Mon, 13 Feb 2017 08:40:05 GMT
Content-Type: text/html; charset=utf8
Content-Length: 3683
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Fri, 03 Feb 2017 07:30:25 GMT
Accept-Ranges: bytes

#
游客

返回顶部