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

来源: Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python_lvfk-CSDN博客

准备工作
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文件,添加以下四行代码

<span style=”white-space:pre”> </span>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
/// <summary>
/// 获取反向代理时的客户端的IP地址
/// </summary>
/// <returns>返回客户端真实IP</returns>
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
————————————————
版权声明:本文为CSDN博主「lvfk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/just_shunjian/article/details/51454346

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏