当前位置:首页 > linux教程 > 列表

Linux下Nginx+Django+uWsgi+MySQL多站点虚拟环境搭建

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-29 14:03:08 浏览: 评论:0 

本文章为各位介绍Linux下Nginx+Django+uWsgi+MySQL多站点虚拟环境搭建希望文章能对各位有所帮助哦.

环境说明:

  1. Linux : rhel 5.3 
  2. nginx:nginx-1.6.2 
  3. python:2.7.9 
  4. django: 1.6.7 
  5. uwsgi: 2.0.10 

注意,要预先装好编译环境必备的开发包及libxml2,python-devel,pcre-devel,mysql-devel

2.软件下载地址

  1. nginx     http://nginx.org/download/nginx-1.6.2.tar.gz 
  2. Python     https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 
  3. Virtualenv     https://pypi.python.org/packages/source/v/virtualenv/virtualenv-12.0.7.tar.gz#md5=e08796f79d112f3bfa6653cc10840114 
  4. Django     https://www.djangoproject.com/download/1.6.7/tarball 
  5. uwsgi     http://projects.unbit.it/downloads/uwsgi-2.0.10.tar.gz 
  6. MySQL-python  https://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.5.zip#md5=654f75b302db6ed8dc5a898c625e030c 

3.软件安装,安装nginx:

  1. # yum install pcre-devel gcc openssl-devel –y 
  2. # cd /usr/local/src/django-env 
  3. # tar -zxvf nginx-1.6.2.tar.gz 
  4. # cd nginx-1.6.2 
  5. # sed -i -e 's/1.6.2//g' -e 's/nginx\//WS/g' -e 's/"NGINX"/"WS"/g' src/core/nginx.h 
  6. # useradd webadmin 
  7. # ./configure --user=webadmin --group=webadmin --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 
  8. # make && make install 

安装python:

  1. # cd /usr/local/src/django-env 
  2. # tar -zxvf Python-2.7.9.tgz 
  3. # cd Python-2.7.9 
  4. # ./configure --prefix=/usr/local/python2.7 
  5. # make && make install 

安装virtualenv:

  1. # cd /usr/local/src/django-env 
  2. # tar –zxvf virtualenv-12.0.7.tar.gz 
  3. # cd virtualenv-12.0.7 
  4. # /usr/local/python2.7/bin/python setup.py install 

构建虚拟环境:

  1. # cd /usr/local/python2.7/bin 
  2. # ./virtualenv /home/webadmin/virtualenv/tools 
  3. New python executable in /home/webadmin/tools/bin/python 
  4. Installing setuptools, pip...done. 

进入并查看虚拟环境:进入虚拟环境在虚拟环境(长前缀的都表示在虚拟环境中的操作),默认会安装好easy_install这类工具.

  1. # source /home/webadmin/virtualenv/tools/bin/activate(退出执行命令 deactivate) 
  2. (tools)[root@tools bin]# 
  3. (tools)[root@tools bin]# python -V 
  4. Python 2.7.9 

安装Django-1.5.4:

  1. (tools)[root@tools ~]# cd /usr/local/src/django-env/ 
  2. (tools)[root@tools django-env]# tar -zxvf Django-1.5.4.tar.gz 
  3. (tools)[root@tools django-env]# cd Django-1.6.7 
  4. (tools)[root@tools Django-1.6.7]# python setup.py install 

安装uwsgi:

  1. (tools)[root@tools ~]# cd /usr/local/src/django-env/ 
  2. (tools)[root@tools django-env]# tar -zxvf uwsgi-2.0.10.tar.gz 
  3. (tools)[root@tools django-env]# cd uwsgi-2.0.10 
  4. (tools)[root@tools uwsgi-2.0.10]# python uwsgiconfig.py --build 
  5. (tools)[root@tools uwsgi-2.0.10]# python setup.py install 

安装mysql-python:

  1. (tools)[root@tools ~]# cd /usr/local/src/django-env/ 
  2. (tools)[root@tools django-env]# unzip MySQL-python-1.2.5.zip 
  3. (tools)[root@tools django-env]# cd MySQL-python-1.2.5 
  4. (tools)[root@tools MySQL-python-1.2.5]# python setup.py install 

注意事项:如果系统没有安装mysql-devel包,在安装MySQL-python的时候会报如下错误:

  1. Traceback (most recent call last): 
  2. File "setup.py", line 16, in <module> 
  3. metadata, options = get_config() 
  4. File "/root/lzh/MySQL-python-1.2.2/setup_posix.py", line 43, in get_config 
  5. libs = mysql_config("libs_r") 
  6. File "/root/lzh/MySQL-python-1.2.2/setup_posix.py", line 24, in mysql_config 
  7. raise EnvironmentError, "%s not found" % mysql_config.path 
  8. EnvironmentError: mysql_config not found 

4.软件配置,配置django项目,部署代码:

  1. (tools)[root@tools ~]# mkdir /home/webadmin/djangoproj/tools/ -p 
  2. (tools)[root@tools tools]# unzip tools.zip 
  3. (tools)[root@tools tools]# ls 
  4. dmc  logs  manage.py  plugins  src  static  templates  tools  tools.zip 

在tools的项目配置文件目录,即setting.py所在目录,检查文件wsgi.py.

  1. (tools)[root@tools tools]# cd tools 
  2. (tools)[root@tools tools]# cat wsgi.py 
  3. import os 
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tools.settings") 
  5. from django.core.wsgi import get_wsgi_application 
  6. application = get_wsgi_application() 

同级目录下,创建uwsgi的启动参数的xml文件(wsgi.xml):

  1. <uwsgi> 
  2. <socket>127.0.0.1:9090</socket> 
  3. <listen>20</listen> 
  4. <master>true</master> 
  5. <pidfile>/home/webadmin/logs/tools/uwsgi/uwsgi.pid</pidfile> 
  6. <processes>4</processes> 
  7. <module>wsgi</module>#就是上面那个wsgi.py文件 
  8. <pythonpath>/home/webadmin/djangoproj/tools/tools</pythonpath> 

#建立项目的路径(此项需要注意,在虚拟环境中需要配置到wsgi所在目录,在非虚拟环境中,只需要配置到项目目录即可).

  1. <profiler>true</profiler> 
  2. <memory-report>true</memory-report> 
  3. <enable-threads>true</enable-threads> 
  4. <logdate>true</logdate> 
  5. <limit-as>6048</limit-as> 
  6. <daemonize>/home/webadmin/logs/tools/uwsgi/tools.log</daemonize> 
  7. </uwsgi> 

配置nginx:

  1. location /{ 
  2. include uwsgi_params; 
  3. uwsgi_pass 127.0.0.1:9090; 
  4. #静态文件的处理(如果django中有处理静态文件的了,就可以不要这个了;一般建议将静态文件交给nginx处理好些) 
  5. location /static/ { 
  6. alias /home/webadmin/djangoproj/tools/static/; 
  7. expires 30d; 
  8. break
  9. #配置django admin需要的文件 
  10. location ~* ^/media/(css|img|js)/.*$ { 
  11. root /usr/local/lib/python2.6/site-packages/django/contrib/admin; 
  12. expires 30d;  //phpfensi.com 
  13. break
  14. location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ { 
  15. access_log off; 
  16. break
  17. location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|bmp|js)$ { 
  18. expires 30d; 
  19. break

检查和修正目录权限

(tools)[root@tools webadmin]# chown webadmin:webadmin /home/webadmin/ -R

5.启动服务

  1. (tools)[webadmin@tools ~]$ uwsgi -x /home/webadmin/djangoproj/tools/tools/wsgi.xml 
  2. # /usr/local/nginx/sbin/ngin 

6.多站点部署

重复从构建虚拟环境开始的步骤~然后在虚拟环境中安装好要运行的实际环境,并启动服务即可,配置nginx的虚拟主机即可.

7.故障检查思路

查看的日志包括(nginx日志[Nginx配置文件中定义],uwsgi日志[xml文件中定义]),查看uwsgi日志的主要原因是看uwsgi是否正常接管了nginx下发的请求任务,uwsgi日志可查看django执行错误信息,也可在开发中通过print 打印调试.

nginx错误日志/访问日志查看,两种日志区别在于,前者针对代码程序级的错误,后者针对网络访问级的错误.

8.一些建议

有时候使用killall uwsgi时不能将uwsgi干掉,你可以uwsgi -s reload的方式重启uwsgi或kill -HUP cat /pathto/uwsgi.pid

uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。

一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。

有了uWSGI为什么还需要nginx?nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

9.注意事项

日志里面报类似于“Mon Mar 23 10:26:49 2015 – — no python application found, check your startup logs for errors —”这类错误时,需要好好检查一下xml文件.

这个文件里面行尾不能有空格,参数左右也不能有空格,这个问题坑了我一晚上,日志里面报类似于”ImportError: No module named wsgi”这类错误,需要检查一下你的xml文件的pythonpath选项.

在虚拟环境下,需要配置到uwsgi所在目录,非虚拟环境下,只需要配置到项目所在路径即可.

10.备注

启动时,正常的日志:

  1. Mon Mar 23 10:59:20 2015 – *** Starting uWSGI 2.0.10 (64bit) on [Mon Mar 23 10:59:20 2015] *** 
  2. Mon Mar 23 10:59:20 2015 – compiled with version: 4.1.2 20080704 (Red Hat 4.1.2-44) on 22 March 2015 22:08:54 
  3. Mon Mar 23 10:59:20 2015 – os: Linux-2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 
  4. Mon Mar 23 10:59:20 2015 – nodename: tools.cyou.com 
  5. Mon Mar 23 10:59:20 2015 – machine: x86_64 
  6. Mon Mar 23 10:59:20 2015 – clock source: unix 
  7. Mon Mar 23 10:59:20 2015 – pcre jit disabled 
  8. Mon Mar 23 10:59:20 2015 – detected number of CPU cores: 16 
  9. Mon Mar 23 10:59:20 2015 – current working directory: /home/webadmin/djangoproj/tools 
  10. Mon Mar 23 10:59:20 2015 – writing pidfile to /home/webadmin/logs/tools/uwsgi/uwsgi.pid 
  11. Mon Mar 23 10:59:20 2015 – detected binary path: /home/webadmin/virtualenv/tools/bin/uwsgi 
  12. Mon Mar 23 10:59:20 2015 – your processes number limit is 268288 
  13. Mon Mar 23 10:59:20 2015 – limiting address space of processes… 
  14. Mon Mar 23 10:59:20 2015 – your process address space limit is 6341787648 bytes (6048 MB) 
  15. Mon Mar 23 10:59:20 2015 – your memory page size is 4096 bytes 
  16. Mon Mar 23 10:59:20 2015 – detected max file descriptor number: 1024 
  17. Mon Mar 23 10:59:20 2015 – lock engine: pthread robust mutexes 
  18. Mon Mar 23 10:59:20 2015 – thunder lock: disabled (you can enable it with –thunder-lock) 
  19. Mon Mar 23 10:59:20 2015 – uwsgi socket 0 bound to TCP address 127.0.0.1:9090 fd 3 
  20. Mon Mar 23 10:59:20 2015 – Python version: 2.7.9 (default, Mar 23 2015, 10:40:10)  [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] 
  21. Mon Mar 23 10:59:20 2015 – Python main interpreter initialized at 0x161c5580 
  22. Mon Mar 23 10:59:20 2015 – python threads support enabled 
  23. Mon Mar 23 10:59:20 2015 – your server socket listen backlog is limited to 20 connections 
  24. Mon Mar 23 10:59:20 2015 – your mercy for graceful operations on workers is 60 seconds 
  25. Mon Mar 23 10:59:20 2015 – mapped 363840 bytes (355 KB) for 4 cores 
  26. Mon Mar 23 10:59:20 2015 – *** Operational MODE: preforking *** 
  27. Mon Mar 23 10:59:20 2015 – added /home/webadmin/djangoproj/tools/tools/ to pythonpath. 
  28. Mon Mar 23 10:59:20 2015 – WSGI app 0 (mountpoint=”) ready in 0 seconds on interpreter 0x161c5580 pid: 24588 (default app) 
  29. Mon Mar 23 10:59:20 2015 – *** uWSGI is running in multiple interpreter mode *** 
  30. Mon Mar 23 10:59:20 2015 – spawned uWSGI master process (pid: 24588) 
  31. Mon Mar 23 10:59:20 2015 – spawned uWSGI worker 1 (pid: 24599, cores: 1) 
  32. Mon Mar 23 10:59:20 2015 – spawned uWSGI worker 2 (pid: 24600, cores: 1) 
  33. Mon Mar 23 10:59:20 2015 – spawned uWSGI worker 3 (pid: 24601, cores: 1) 
  34. Mon Mar 23 10:59:20 2015 – spawned uWSGI worker 4 (pid: 24602, cores: 1)

Tags: Nginx+Django+uWsgi+MySQL

分享到: