找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1599|回复: 1

[NAS/Server] 用nginx反向代理解决VMware虚拟机在NAT模式下的80端口访问问题

[复制链接]
发表于 2013-10-17 20:09 | 显示全部楼层 |阅读模式
用nginx反向代理解决VMware虚拟机在NAT模式下的80端口访问问题



相信很多朋友已经遇到了这个问题,但是都没有什么好的解决方案。首先思路上觉得是只有一个公网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.comwww.002.com 到宿主机 10.1.1.3。

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

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

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

  12. server {
  13. listen 80;
  14. server_name www.002.com;
  15. location / {
  16. proxy_pass http://192.168.84.128; //后端ip地址
  17. proxy_redirect off; //关闭后端返回的header修改
  18. proxy_set_header Host $host; //修改发送到后端的header的host
  19. proxy_set_header X-Real-IP $remote_addr; //设置真实ip
  20. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  21. }
  22. }
复制代码

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

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

测试IP用例(PHP):



index.html

  1. <?php
  2. if($_SERVER['HTTP_CLIENT_IP']) {
  3. $ip = $_SERVER['HTTP_CLIENT_IP'];
  4. } elseif ($_SERVER['HTTP_X_FORWARDED_FOR']) {
  5. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  6. } else {
  7. $ip = $_SERVER['REMOTE_ADDR'];
  8. }
  9. echo $ip;
  10. echo "<br>";
  11. echo $_SERVER["HTTP_X_FORWARDED_FOR"];
  12. echo "<br>";
  13. echo $_SERVER["HTTP_CLIENT_IP"];
  14. echo "<br>";
  15. echo $_SERVER["REMOTE_ADDR"];
  16. echo "<br>";
  17. echo getenv("HTTP_X_FORWARDED_FOR");
  18. echo "<br>";
  19. echo getenv("HTTP_CLIENT_IP");
  20. echo "<br>";
  21. echo getenv("REMOTE_ADDR");
  22. ?>
复制代码

index2.html

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




===================================================
Linux服务器上最简单的Nginx反向代理配置

Nginx不但是一款高性能的Web服务器,也是高性能的反向代理服务器。下面简单说说Nginx的反向代理功能。

反向代理是什么?

反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部或其他网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。

简单实现方法:

例如我想在服务器上建一个google.ha97.com的域名用来反向代理访问Google,首先在域名注册商那里的域名管理上为域名google.ha97.com添加A记录到服务器的IP上,再在服务器上修改Nginx的配置文件,添加如下:


server
{
listen 80;
server_name google.ha97.com;

location / {
proxy_pass http://www.google.com/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

保存后重新加载nginx:

/etc/init.d/nginx reload

如果是编译安装的,应用这个命令:

kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

等域名解析生效后就可以通过google.ha97.com来访问google了。


http://www.ha97.com/3979.html
回复

使用道具 举报

 楼主| 发表于 2013-10-17 20:09 | 显示全部楼层

nginx反向代理配置

nginx作为web服务器一个重要的功能就是反向代理。
当然你也可以使用nginx配置正向代理,本是介绍如何配置nginx的反向代理。
nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。
配置前的准备工作,后端跑apache服务的ip和端口,也就是说可以通过http://ip:port能访问到你的网站。
然后就可以新建一个vhost.conf,加入如下内容,记得修改ip和域名为你的ip和域名。
修改nginx.conf,添加 include quancha.conf 到http{}段, reload nginx就可以了。
nginx反向代理模板

## Basic reverse proxy server ##
## Apache backend for www.quancha.cn ##
upstream apachephp  {
    server ip:8080; #Apache
}
  
## Start www.quancha.cn ##
server {
    listen 80;
    server_name  www.quancha.cn;
  
    access_log  logs/quancha.access.log  main;
    error_log  logs/quancha.error.log;
    root   html;
    index  index.html index.htm index.php;
  
    ## send request back to apache ##
    location / {
        proxy_pass  http://apachephp;
  
        #Proxy Settings
        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;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}
## End www.quancha.cn ##




回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|Archiver|手机版|小黑屋|吹友吧 ( 京ICP备05078561号 )

GMT+8, 2024-12-22 21:12 , Processed in 0.296244 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表