• nginx 反向代理


    引用:http://moper.me/nginx-reverse-proxy-vmware-nat.html

    相信很多朋友已经遇到了这个问题,但是都没有什么好的解决方案。首先思路上觉得是只有一个公网IP,必须要有一个支持应用层的程序来进行转发,进行代理才能够顺利的把相应的请求发到相应的后端机器上,结果自然选择nginx来进行反向代理了。

    环境:
    宿主机是Windows2003,IP为10.1.1.3,装VMware Workstation 8(生产环境可以装VMware service 2.0.2或者VMware Esx 5来试一下)。在windows2003上运行nginx的win版。VM开两台虚拟机,网络模式为NAT模式。一台IP为192.168.84.128,一个台为192.168.84.129。分别开启80端口进行web服务。
    修改测试机的hosts文件,指定www.001.com和www.002.com到宿主机10.1.1.3。

    目的:
    通过对宿主机win2003上的nginx设置,使解析到宿主机IP上的域名能够正常访问后面的web服务。适用于只有一个公网IP需要部署多个虚拟机来提供80端口web服务,一个虚拟机一个IP对应一个域名。

    方法:
    1、在nginx.conf最后一个”}”前,加入“include proxy.conf;”。

    2、在同目录下,建立”proxy.conf”文件,内容如下:
    server {
    listen 80;
    server_name www.001.com;
    location / {
    proxy_pass http://192.168.84.129; //后端ip地址
    proxy_redirect off; //关闭后端返回的header修改
    proxy_set_header Host $host; //修改发送到后端的header的host
    proxy_set_header X-Real-IP $remote_addr; //设置真实ip
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    server {
    listen 80;
    server_name www.002.com;
    location / {
    proxy_pass http://192.168.84.128; //后端ip地址
    proxy_redirect off; //关闭后端返回的header修改
    proxy_set_header Host $host; //修改发送到后端的header的host
    proxy_set_header X-Real-IP $remote_addr; //设置真实ip
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    此番配置之后,已经可以用任何解析到宿主机的IP的域名,访问自己的站点了。

    可能遇到的问题:
    后面的各种程序无法获得真实的访客IP,查了一下,可能是程序写的不完善造成的,具体看下面的测试IP用例,如果哪个方法可以获得正确的IP,可以替换源程序的相应函数。

    测试IP用例(PHP):

    ?Download index.html
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    <?php
    if($_SERVER['HTTP_CLIENT_IP']) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ($_SERVER['HTTP_X_FORWARDED_FOR']) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
    $ip = $_SERVER['REMOTE_ADDR'];
    }
    echo $ip;
    echo "<br>";
    echo $_SERVER["HTTP_X_FORWARDED_FOR"];
    echo "<br>";
    echo $_SERVER["HTTP_CLIENT_IP"];
    echo "<br>";
    echo $_SERVER["REMOTE_ADDR"];
    echo "<br>";
    echo getenv("HTTP_X_FORWARDED_FOR");
    echo "<br>";
    echo getenv("HTTP_CLIENT_IP");
    echo "<br>";
    echo getenv("REMOTE_ADDR");
    ?>
    ?Download index2.html
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    <?php
    //获得真实IP
    if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) 
    { 
    $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; 
    } 
    elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) 
    { 
    $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"]; 
    }
    elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]) 
    { 
    $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; 
    } 
    elseif (getenv("HTTP_X_FORWARDED_FOR")) 
    { 
    $ip = getenv("HTTP_X_FORWARDED_FOR"); 
    } 
    elseif (getenv("HTTP_CLIENT_IP")) 
    { 
    $ip = getenv("HTTP_CLIENT_IP"); 
    } 
    elseif (getenv("REMOTE_ADDR"))
    { 
    $ip = getenv("REMOTE_ADDR"); 
    } 
    else 
    { 
    $ip = "Unknown"; 
    } 
    echo "真实IP:".$ip ; 
    ?>

    有一个问题是,无法远程来管理代理的主机,因为他们没有公网的IP,目前还不知道能否也用nginx来代理相应端口,有待实验。但是如果你是在内部来管理服务器的话,这样子正好提高了安全性,外面的人无法直接访问到后面的虚拟机。

    没有在VMware Esx的环境下试验,不知道能否成功,感觉思路是一样的,有空再试试咯。

  • 相关阅读:
    按钮字体颜色的设置
    异常
    数据存储
    SQLiteOpenHelper
    MVC
    在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系
    ListView 的优化方案
    fragment生命周期及优点
    ANR
    Android系统架构
  • 原文地址:https://www.cnblogs.com/sode/p/2715501.html
Copyright © 2020-2023  润新知