作者:电脑信息网日期:
返回目录:win7问题
起初我很是奇怪,按理说只有当静态文件不存在时nginx才会返回404错误,而现在访问的是配置在nginx.conf中的一个动态路径,该动态路径请求通过fastcgi最终会映射到某个python class的GET或POST方法中,那为什么nginx会返回404呢?
查阅相关文档之后发现
fastcgi在遇到webpy或其他后端http模块处理极慢的情况下,也就是说超过nginx允许的应答时间,nginx就会对此动态路径请求做出404的应答
针对此情况,我开始着手准备一系列测试和实验
实验
实验一:剥离fastcgi,单独使用webpy,进行压力测试
这个实验很简单,只需要注释掉一行代码,便可以以纯webpy方式访问,基于webpy的python应用main入口一般都是这样:
?
1
2
3
4
if __name__ == "__main__":
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func,addr)
app.add_processor(web.loadhook(session_hook))
app.run()
只需要注释掉第二行即可,之后在终端下运行python <filename>.py,webpy会默认监听本地的8080端口,之后无论是通过浏览器还是其他方式访问相应地址即可
同时,还需要准备一份发起http请求的代码,python用来干这活最简单不过了
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import httplib
server = "192.168.2.2:8080"
url = "/user/login?username=&password=111&rnd=33"
class perftest:
def __init__(self):
pass
def run(self):
conn = httplib.HTTPConnection(server)
for i in range(100):
try:
conn.request("GET", url)
rsp = conn.getresponse()
if 200 == rsp.status:
print "headers", rsp.getheaders()
content = rsp.read()
print "content", content
except Exception, ex:
print "ERR:", ex
conn.close()
跑了几次压力之后,webpy扛不住了…开始大面积抛异常,大致意思是python自带的logging模块出错,因为有频繁的文件打开关闭操作,某个操作导致文件句柄被非法访问…
在查看相关的log封装类之后发现,python的日志模块设计实在是有点不够内聚,也可以说不够彻底吧,不由得想起了之前用过的log4net,真是简洁啊
出错的原因在项目中开发同事封装的log模块多次执行了addHandler和removeHandler操作,据说在之前的开636f7079e799bee5baa6366发过程中还出现过一行日志打印多遍的情况,而且随着程序的运行,相同的日志会越来越多…
顺手将该封装修改为单例类之后,故障解除
处理完之后接着跑压力,webpy还是会偶尔打印异常信息,不过已经变成了session访问异常,还好的是出现面积很小,于是开始增加压力测试的并发量,结果表明稳定度还是可以的,性能也在可以接受的范围之内
实验二:保持最终部署环境不变(nginx+fastcgi+webpy),继续压力测试
在上次测试解决完日志的问题之后,我开始以真实环境做相关的测试,要注意的是使用nginx之后,需要访问nginx.conf中配置绑定的相关端口,不再是webpy默认的8080端口
继续做上述的压力测试,性能也在可以接受的范围之内
实验三:模拟用户环境
根据测试MM所描述的,浏览器在B子系统出错过程中扮演了很关键的角色,于是我分别使用几个浏览器和纯粹的python代码分别访问相同的地址
几种组合的测试发现:
浏览器在只访问B子系统的情况下,一直表现正常
一旦浏览器访问过A子系统之后,再次访问B子系统即出现测试MM描述的404现象
python代码一直访问正常
1、安装python
下载最新的python版本,在本文撰写时为 python 3.4,
下载地址:https:///ftp/python/3.4.0/python-3.4.0.msi,现在完成后点击运行,完成python安装(如c:/python34).
配置python路径支持,右键“计算机”=》“属性”=》“高级系统设置”=》“高级”=》“环境变量”=》“系统变量”=>"Path"=&
gt;"编辑",在后面追加";c:\python34"。这样,就可以在命令行窗口下直接运行"python.exe"。运行"cmd",打开一个控制
台窗口,运行"python -V",显示“Python 3.4.0"即表示成功。
2、安装Django
下载最新版 Django
1.6.2,下载地址: https:///download/nginx-1.5.13.zip。下载后解压到一个特定目录(如C:\nginx)即可。
运行nginx,打开浏览器,输入"127.0.0.1",显示" Welcome to nginx!"即表示成功。
5、新建项目
运行"cmd"打开控制台窗口,输入"d:"(假设项目目录为d:\mysite)切换到d盘。输入"django-admin.py startproject mysite",这样就建立了一个名为"mysite"的项目.
6、重定向nginx静态文件到"mysite"
编辑"C:\nginx\conf\nginx.conf"文件,将其中第一个"... root
html;..."更改为“root d:/mysite/html”。运行"c:\nginx\nginx.exe -s
reload"重新加载nginx。打开浏览器,输入“127.0.0.1”,显示“404”错误。这是因为"d:\mysite\html"目录及文件
不存在。新建"d:\mysite\html"目录,并在此目录下新建一个"hello.html"文件。输
入"<html><body>Hello</body></html>",保存。打开浏览器,输
入"127.0.0.1/hello.html",应该会显示"hello"信息。
7、运行django fastcgi服务
打开控制台,进入"d:\mysite"目录,运行"manage.py runfcgi method=threaded host=127.0.0.1 port=8008".启动FastCGI服务。
8、修改nginx配置文件“nginx.conf",在第一个server(listen 80)组,做一下修改
#1、注释默认的页面位置:
#location / {
# root html;
# index index.html index.htm;
#}
#2、添加 定向所有页面请求到FastCGI
location / {
root d:/mysite;
fastcgi_pass 127.0.0.1:8008;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
#3、定向静态页面请求到页面目录中
location ~* \.(gif|jpg|jpeg|html|js|css|png)$ {
root d:/mysite/html;
index index.html index.htm;
}
运行"nginx -s reload"更新配置。
在目录(d:\mysite\html)下添加页面文件"hello.html".在浏览器中输入localhost/hello.html将显示该静态页面内容。
9、在浏览器中键入"localhost"将显示django欢迎页面。
1.安装nginx安装过nginx这就不好从新演示了.默认你也安装好了nginx.2.安装flup$:dpkg -l *flup*打印信息:Desired=Unknown/Install/Remove/Purge/Hold| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)||/ Name Version Description+++-===========================-===========================-======================================================================ii python-flup 0.2126-1 Implements Python Web Server Gateway Interface (WSGI)$:apt-get install python-flup3:配置nginx.conf.这个是按照网上配置的.server {listen 1235;server_name localhost;#charset koi8-r;#access_log /dev/null;access_log /usr/local/nginx/logs/access.log;location / {#location /htm {# root /home/utest/ms;#}root /home/utest/ms;fastcgi_pass 127.0.0.1:1234;fastcgi_param PATH_INFO $fastcgi_script_name;fastcgi_param REQUEST_METHOD $request_method;fastcgi_param QUERY_STRING $query_string;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param CONTENT_LENGTH $content_length;include fastcgi_params;fastcgi_pass_header Authorization;fastcgi_intercept_errors off;}}解释:端口7a64e58685e5aeb9339:1235--为监听端口.端口:1234----为web服务器运行的端口.from=olddocs
CGI的英文全称为Common Gateway Interface(公共网关接口),是Nginx和动态脚本程序7a64e4b893e5b19e364的桥梁,Nginx通过FastCGI接口将动态请求发送给FastCGI,FastCGI中的Wrapper进程生成一个线程,将请求交给脚本解释程序执行,然后通过原来的socket将解释执行后的结果原路返回给Nginx,之后Nginx将结果交给客户端。 Nginx是通过套接字文件socket来将动态请求发送给wrapper,使用的是Tcp协议。wrapper通过CGI接口来接受请求。这样web服务器和解释程序之间完全可以独立开发,这样避免了解释程序直接调用服务器的接口而导致的出错和崩溃以及安全性问题。而且可以使Nginx专心处理静态页面请求和转发动态请求,而将脚本解释器安装在另一台服务器,使服务器的压力得到分摊。 CGI是作为PHP程序的补丁开发的,安装PHP首先安装其所依赖的库,之后在编译配置参数时加入对CGI的支持--enable-fpm --enable-cgi等选项。编译PHP的扩展模块,需要用到php中的phpize工具用来生成模块编译时的configure文件,如果运行phpize时无法生成configure文件,原因有:没有安装autoconf软件包。 php-fpm进程的配置文件为/usr/local/php/etc/php-fpm.conf 可以对php-fpm进行相应的配置。 Nginx配置支持fastcgi: location ~ \.php${ root html; fastcgi_pass unix:/tmp/fastcgi.soke //通过套接字文件和cgi建立联系,该文件在php-fpm.conf中设置 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME html$SCRIPT_FILE_NAME;设置参数 include fastcgi_params; //导入fastcgi参数配置文件,该文件在nginx安装时自动生成。 }