Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python

准备工作

1、安装Nginx

官网下载 http://nginx.org/en/download.html

2、安装IIS

3、安装python

官网下载 https://www.python.org/

4、配置flup

WSGI是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它了可移植性方面的目标。  
      WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何实现(Server)上运行, 反之亦然。
WSGI具体实现有很多种方法,网上有很多的用python写的框架,比如facebook的tornado,这次选用的是flup
下载以及具体的介绍可以到  http://pypi.python.org/pypi/flup/1.0,
当下载后解压,把文件夹中的flup这个文件夹拷贝到Nginx的安装目录 Python27\Lib\site-packages下面,即可完成flup的配置

ps:1、此处Python和flup需要搭配使用,因为flup有对应py的版本限制

2、Nginx绑定80端口失败,请在Windows的服务中禁用 SQL Server Reporting Services (SQLEXPRESS) 这个服务,因为它就占用了80端口

Nginx配置Python

1、修改nginx-1.10.0\conf中的nginx.conf,在其中增加下面代码

server {
	listen 80;
	server_name test.com;
       #此处的location配置访问服务器上的py
      location ^ ~ /python/ {
               #fastcgi_pass unix: /tmp/python - cgi.sock;
		fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
                #下面三句不用改动
                fastcgi_param SCRIPT_FILENAME "";
		fastcgi_param PATH_INFO $fastcgi_script_name;
		include fastcgi.conf
	}
}
2、编写py文件test.py

#!/usr/bin/python
# encoding : utf-8

from cgi import parse_qs
from cgi import escape
from flup.server.fcgi import WSGIServer

def myapp(environ, start_response):
    #下面代码是从请求URL中提取URL参数
    parameters = parse_qs(environ.get('QUERY_STRING', ''))
    if 's' in parameters:
        s = escape(parameters['s'][0])
    if 'url' in parameters:
        url = escape(parameters['url'][0])

    #r = test(s, url)
    
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return "s="+s+"---"+"url="+url;

if __name__  == '__main__':
   #此处监听的是Nginx中配置的ip和端口
   WSGIServer(myapp,bindAddress=('127.0.0.1',8008)).run()

3、运行Nginx

用命令行窗口进入到Nginx文件夹,执行Start Nginx 或者 Nginx

4、运行Py文件test.py

用命令行窗口进入到test.py所在文件夹,执行下面代码

python ytsig.py --method=prefork/threaded minspare=50 maxspare=50maxchildren=1000

5、你就可以在浏览器中访问 http://127.0.0.1/python/?s=12&url=http://127.0.0.1

Nginx反向代理IIS

首先,在IIS中使用ASP.NET MVC4建了一个网站,把其端口设置为:8888(可任意设置一个可用端口)

接下来此处非常简单就可以实现Nginx反向代理IIS,我们接着刚刚Nginx配置Python的基础上执行添加一段代码即可,如下:

server {
	listen 80;
	server_name test.com;
       #此处的location配置访问服务器上的py
      location ^ ~ /python/ {
               #fastcgi_pass unix: /tmp/python - cgi.sock;
		fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
                #下面三句不用改动
                fastcgi_param SCRIPT_FILENAME "";
		fastcgi_param PATH_INFO $fastcgi_script_name;
		include fastcgi.conf
	}
    
     #访问IIS,当请求链接不包含有/python/时,就转向到IIS中
     location / {
		proxy_pass http:127.0.0.1 : 8888  #IIS中网站配置的IP和端口
	}
}


至此,我们就完成了Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python


(补充)Nginx反向代理IIS,IIS如何获取客户端真实IP

1、修改Nginx的nginx.conf文件,添加以下四行代码

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server {
	listen 80;
	server_name test.com;
       #此处的location配置访问服务器上的py
      location ^ ~ /python/ {
               #fastcgi_pass unix: /tmp/python - cgi.sock;
		fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
                #下面三句不用改动
                fastcgi_param SCRIPT_FILENAME "";
		fastcgi_param PATH_INFO $fastcgi_script_name;
		include fastcgi.conf
	}
    
     #访问IIS,当请求链接不包含有/python/时,就转向到IIS中
     location / {
                proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header REMOTE-HOST $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http:127.0.0.1 : 8888  #IIS中网站配置的IP和端口
	}
}

2、在IIS网站的ASP.NET MVC代码中添加如下代码获取客户端的真实IP

#region 获取反向代理时的客户端的IP地址 getClientIP
        /// 
        /// 获取反向代理时的客户端的IP地址
        /// 
        /// 返回客户端真实IP
        private string getClientIP()
        {
            HttpRequestBase request = HttpContext.Request;

            string ip = request.Headers.Get("x-forwarded-for");

            if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase))
            {
                ip = request.Headers.Get("Proxy-Client-IP");
            }
            if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase))
            {
                ip = request.Headers.Get("WL-Proxy-Client-IP");

            }
            if (ip == null || ip.Length == 0 || string.Equals("unknown", ip, StringComparison.OrdinalIgnoreCase))
            {
                ip = request.UserHostAddress;
            }
            return ip;
        } 
        #endregion

完成以上设置,再重新启动Nginx及IIS,即可在IIS中获取客户端真实IP。


Over…


参考资料:

1、http://blog.163.com/sky20081816@126/blog/static/1647610232010824262695/

2、http://blog.csdn.net/cclovett/article/details/26259175

3、http://zhidao.baidu.com/link?url=CdWrjHJ3VLiawbVfjSdB7G8fwzTcypd4qvOyT3xzx3BZG4_G2P_DbTHVSpiMupQQaeFwpajZjckwVkDpg6ZfgpzabZpzofwGjeTks2CCd_e

你可能感兴趣的:(mvc4,asp.net,nginx,iis,python,flup,WSGI,反向代理)