Django -- 整合apachenginx
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django -- 整合apachenginx相关的知识,希望对你有一定的参考价值。
前面章节我们都是通过python manage.py runserver运行服务器,访问django,但这只适用于测试环境。当项目正式发布后,我们需要一个稳定可持续的服务器,比如apache、nginx等等。接下来我们将用apache、nginx启动服务器。
wsgi:一种实现了python解析的通用接口标准/协议,实现了python web程序与服务器交互。
uwsgi:他也是一种通信协议,是uWSGI服务器自有的协议;
uWSGI:一种python的web服务器,实现了uwsgi、WSGI两种协议,而uwsgi实现了WSGI、uwsgi、http等协议。apache、nginx都必须引用模块才能解析动态语言。只不过这两个具备很好的静态内容处理能力。
gunicorn/uwsgi:都是wsgi协议(python web server gateway interface)的实现,它们做的事情是协议转换,协议的一头是web app(如flask, django等framework的app),另一头是web server(如apache, nginx等);
gunicore/uwsgi在默认的情况下都是同步模型,但都比通常的web framework实现得好。
gevent是利用协程(greenlet库)实现的一个高性能异步IO的库,它做的事情就是实现异步模型。
====================================================================
Apache (wsgi模块)
yum install mod_wsgi
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/
<VirtualHost *:80> WSGIScriptAlias / /opt/simplecmdb/simplecmdb/wsgi.py WSGIDaemonProcess simplecmdb python-path=/opt/simplecmdb:/usr/lib64/python2.7/site-packages WSGIProcessGroup simplecmdb Alias /static /usr/lib64/python2.7/site-packages/django/contrib/admin/static <Directory /opt/simplecmdb/simplecmdb> <Files wsgi.py> Require all granted </Files> </Directory> <Directory /usr/lib64/python2.7/site-packages/django/contrib/admin/static> Require all granted </Directory> </VirtualHost> WSGISocketPrefix /var/run/wsgi
nginx (gunicorn模块)
pip install gunicorn
server { listen 192.168.1.106:8000; server_name node01; location /static/admin/ { root /usr/lib/python2.6/site-packages/django/contrib/admin/; index index.html index.htm; } location / { proxy_pass http://localhost:8000; } }
cd ~/项目下/ && gunicorn 项目名.wsgi:application -D
如果访问不到,去掉-D后台模式,看是否执行成功;
另外查看见监听端口,至少两个一个是nginx配置启动的8000,一个是127.0.0.1的8000。
------------------------------------------------------------------------------------------------
uwsgi模块 :效率要比wsgi好的多的多
--------------------------------------------------------------------------------------------------------------
nginx (uwsgi模块)
pip install uwsgi
新建test.py文件,内容如下:
def application(env, start_response): start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)]) return "Hello World"
运行:uwsgi --http 10.0.18.33:8001 --wsgi-file test.py
访问:10.0.18.33:8001 输出 Hello World 即成功。
cat /etc/uwsgi9090.ini
[uwsgi] socket = 127.0.0.1:8001 master = true //主进程 vhost = true //多站模式 no-site = true //多站模式时不设置入口模块和文件 workers = 2 //子进程数 reload-mercy = 10 vacuum = true //退出、重启时清理文件 max-requests = 1000 limit-as = 512 buffer-size = 30000 pidfile = /var/run/uwsgi9090.pid daemonize = /website/uwsgi9090.log
修改nginx配置文件:vim uwsgi_django.conf
server { listen 10.0.18.33:8001; server_name uwsgi.django.test; location / { uwsgi_pass 127.0.0.1:8001 #必须和uwsgi中的设置一致 uwsgi_param UWSGI_SCRIPT HelloWorld.wsgi; #入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录 uwsgi_param UWSGI_CHDIR /qqqqqqqqq/python/django/HelloWorld; #项目根目录 index index.html index.htm; client_max_body_size 35m; } }
启动:uwsgi --ini /etc/uwsgi9090.ini && /usr/local/nginx/sbin/nginx
测试:首先查看端口是不是都起来了,然后访问http://10.0.18.33:8001/,出现django界面即可。
重启:fuser -k 8001/tcp
-----------------------------------------------------------------------------------------------------
错误一:ImportError: No module named HelloWorld.settings
unable to load app 0 (mountpoint=‘‘) (callable not found or import error)
解决:export PYTHONPATH=$PYTHONPATH:/qqqqqqqqq/python/django/HelloWorld ,因为在sys.path中找不到项目路径,当然加入到path的方法也很多,以上只是其中一种。
错误二:ImportError: No module named django.core.wsgi
unable to load app 0 (mountpoint=‘10.0.18.33:8001|‘)
解决:vim /etc/uwsgi9090.ini 添加pythonpath = /usr/lib/python2.7/site-packages 即可
-----------------------------------------------------------------------------------------------------
以上是关于Django -- 整合apachenginx的主要内容,如果未能解决你的问题,请参考以下文章