Last updated
Was this helpful?
Last updated
Was this helpful?
Web服务直接面向外部,直接从文件系统提供文件服务(HTML,图片,CSS 等)。然而,web服务器不是直接和Django应用程序通讯,它需要某个事物来运行应用程序,从web客户端提供请求和响应返回。
Web Server Gateway Interface(Web服务器网管接口)WSGI就是完成上述工作的Python标准。
uWSGI是一个WSGI的实现,创建一个Unix Socket,服务器通过WSGI协议响应到web服务器,流程如下:
首先要启用一个virtualenv环境 - 这里设置虚拟环境的名字是 venv ,也可以用其他名字
安装Django到这虚拟环境
注意:我的实践案例是将Django的站点部署在
/home/huatai/works/mysite
此时用命令参数0:8000
使得端口监听
在虚拟环境安装uWSGI
编译以后在当前目录下有生成一个uwsgi
二进制文件,将这个二进制文件复制到virtualenv的执行目录下,例如~/venv2/bin/
就安装完成了:
基本测试
创建一个test.py
:
运行uWSGI
在前面已经实现了Django启动功能验证
如果上述工作正常,就可以测试使用uWSGI来运行:
此时用浏览器访问也可以看到同样的Django工作页面。此时访问路径:
安装nginx
注意:默认CentOS7开启了防火墙,需要增加端口访问:
此时访问方式:
nginx 有两个配置目录:
/etc/nginx/conf.d/*.conf
用于加载模块文件
/etc/nginx/default.d/*.conf
用于加载默认服务器配置
较新的nginx版本,则使用/etc/nginx/site-enabled/
目录来存放软链接到激活配置文件。
创建名为 mysite_nginx.conf
配置如下
如果是新版本nginx,可以将自定义配置文件软链接到/etc/nginx/sites-enabled
目录下
如果是老版本nginx,则将自定义文件软链接到/etc/nginx/conf.d/
目录下
部署静态文件
在运行nginx之前,还需要在static目录搜集所有Django静态文件,也就是编辑mysite/settings.py
配置添加
上述配置是
STATIC_URL = '/static/'
之后,也就是如下配置
然后运行
执行该命令之后,会自动在/home/huatai/works/mysite
下创建 static
子目录
注意
当修改了js文件,需要重新刷新静态文件(否则会导致无法看到修改内容):
重新启动nginx
前述已经启动了uwsgi,如下
页面提示:504 Gateway Time-out
,而在nginx日志中有报错
检查配置文件,如下配置看确实是转发给上游8000端口:
暂时没有解决这个nginx访问 wsgi 的 http 端口问题,不过,采用 socket 方法验证通过,所以当前使用 socket 方法。
注意:这里需要设置
--chmod-socket=664
以便能够让同属于一个用户组的 nginx 进程可以读写这个socket。
上述测试test.py
成功后,就可以开始运行Django应用程序了:
创建 mysite_uwsgi.ini
然后执行
注意:对于不使用virtualenv的环境,base = /home/huatai/works/mysite
需要改成 chdir = /home/huatai/works/mysite
,这样,uWSGI会使用chdir
替代当前目录。
也可以参考 手工下载安装
此时访问 可以看到输出内容 Hello World
注意:参考对于没有开启IPv6的系统,需要注释掉nginx.conf
中的#listen [::]:80 default_server;
。
需要使用uwsgi_params
文件,位于nginx
目录下,也可以从 获取。
参考
另外,要验证多媒体文件是否可以正常访问,则在 /home/huatai/works/mysite
下创建 media
目录,然后存放一个 test.png
文件,然后通过 访问验证。
此时就可以通过 访问到这个Hello world
页面
遇到nginx转发给uWSGI之后,长时间没有响应的问题(仅测试 test.py 无计算,理论速度应该极快),通过替换直接运行 django 可以看到nginx确实是转发给后端的uwsgi。然而,访问 长时间超时无响应。
但是直接访问 响应非常快速。(通过替换默认的额django )
参考 可以看到,uWSGI默认是关闭了stdin
(重定向到 /dev/null),如果需要stdin
添加 --honour-stdin
此时,通过 或者主机的IP地址就可以访问到django的页面