之前在apache上基于mod_wsgi模式安装过Django应用,后来转到LNMP环境,再加上近期uWSGI的流行,本文将基于LNMP+uWSGI重新部署Django应用。
注:1、本文仅实现单站点部署方式,多站点虚拟主机可以通过virtualenv实现。
2、本文的环境是基于LNMP,运行于CentOS,已经安装了Nginx、PHP、MySQL、Memcached。并且操作系统自带了Python 2.6.3版本,可以升级到目前的最新版。
3、目前的Django最新版是1.4.2,仅支持Python 2.5--2.7的版本(https://docs.djangoproject.com/en/1.4/intro/install/),在3.x版本上面会出错。
基于上述环境,通过uWSGI方式部署Django应用的步骤如下:
一、安装平台
1、安装MySql-python
#cd /usr/local/src
#wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmysql-python%2Ffiles%2Fmysql-python%2F1.2.3%2F&ts=1353841475&use_mirror=nchc
#tar xzvf MySQL-python-1.2.3.tar.gz
#cd MySQL-python-1.2.3
#vi site.cfg
mysql_config =/usr/local/mysql/bin/mysql_config
#python setup.py build
#python setup.py install
测试:
# python
>>> import MySQLdb
>>>
没有任何输出,安装成功!
如果出现了安装或者使用错误,请参照:http://mysql-python.sourceforge.net/FAQ.html
2、安装setuptools
#cd /usr/local/src
#wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
#sh setuptools-0.6c11-py2.7.egg
3、安装pip
pip是一个可以替代 easy_install的安装和管理 python 软件包的工具,具体可以安装的 python 包可以在这里查看 Python Package Index(http://pypi.python.org/pypi)
相关帖子:http://briteming.blogspot.com/2017/10/pythondjango.html
---------------------------------------------------------
编写
uwsgi
注:1、本文仅实现单站点部署方式,多站点虚拟主机可以通过virtualenv实现。
2、本文的环境是基于LNMP,运行于CentOS,已经安装了Nginx、PHP、MySQL、Memcached。并且操作系统自带了Python 2.6.3版本,可以升级到目前的最新版。
3、目前的Django最新版是1.4.2,仅支持Python 2.5--2.7的版本(https://docs.djangoproject.com/en/1.4/intro/install/),在3.x版本上面会出错。
基于上述环境,通过uWSGI方式部署Django应用的步骤如下:
一、安装平台
1、安装MySql-python
#cd /usr/local/src
#wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmysql-python%2Ffiles%2Fmysql-python%2F1.2.3%2F&ts=1353841475&use_mirror=nchc
#tar xzvf MySQL-python-1.2.3.tar.gz
#cd MySQL-python-1.2.3
#vi site.cfg
mysql_config =/usr/local/mysql/bin/mysql_config
#python setup.py build
#python setup.py install
测试:
# python
>>> import MySQLdb
>>>
没有任何输出,安装成功!
如果出现了安装或者使用错误,请参照:http://mysql-python.sourceforge.net/FAQ.html
2、安装setuptools
#cd /usr/local/src
#wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
#sh setuptools-0.6c11-py2.7.egg
3、安装pip
pip是一个可以替代 easy_install的安装和管理 python 软件包的工具,具体可以安装的 python 包可以在这里查看 Python Package Index(http://pypi.python.org/pypi)
安装pip之前要确保安装了 setuptools或者distribute.
1 2 3 4 5 | #cd /usr/local/src #wget http://pypi.python.org/packages/source/p/pip/pip-1.2.tar.gz #tar xzvf pip-1.2.tar.gz #cd pip-1.2 #python setup.py install # 可能需要root权限 |
pip应用
(1)安装包
# pip install simplejson
(1)安装包
# pip install simplejson
(2)更新包
# pip install --upgrade simplejson
# pip install --upgrade simplejson
(3)移除包
# pip uninstall simplejson
# pip uninstall simplejson
4、安装uWSGI
1 2 3 4 5 6 | #cd /usr/local/src #wget http://projects.unbit.it/downloads/uwsgi-1.4.2.tar.gz #tar -zxvf uwsgi-1.4.2.tar.gz #cd uwsgi-1.4.2 #make #cp uwsgi /usr/bin |
5、安装Django
1 2 3 4 5 | #cd /usr/local/src wget https://www.djangoproject.com/download/1.4.2/tarball/ tar -zxvf Django-1.4.2.tar.gz cd Django-1.4.2 python setup.py install |
创建django项目
项目位置:/home/django/xzhu
创建项目方法:
项目位置:/home/django/xzhu
创建项目方法:
1 2 | #cd /home/django #django-admin.py startproject xzhu |
二、平台配置
1、Nginx相关配置
1 2 3 | #mkdir /usr/local/nginx/conf/django #cd /usr/local/nginx/conf/django #vi django_uwsgi.conf |
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Django project server { listen 80; server_name xzhu.loosky.net; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9000; uwsgi_param UWSGI_CHDIR /home/django/xzhu; uwsgi_param UWSGI_SCRIPT django_wsgi; access_log off; } } |
编辑完成后在nginx.conf追加子配置文件django_uwsgi.conf
1 2 | #cd .. #vi nginx.conf |
内容如下:
1 2 3 4 | http{ ........ include django/*.conf; } |
2、UWSGI配置
1 2 3 4 5 | #mkdir -p /home/uwsgi; #cd /home/uwsgi #mkdir -p /home/django/logs #echo "" > /home/django/logs/django.log #vi uwsgi.xml |
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <uwsgi> <socket>127.0.0.1:9000</socket> <listen>200</listen> <master>true</master> <pidfile>/usr/local/nginx/uwsgi.pid</pidfile> <processes>8</processes> <pythonpath>/home/django/xzhu</pythonpath> <pythonpath>/home/django/</pythonpath> <module>django_wsgi</module> <profiler>true</profiler> <memory -report>true</memory> <enable -threads>true</enable> <logdate>true</logdate> <limit -as>6048</limit> <daemonize>/home/django/logs/django.log</daemonize> </uwsgi> |
3、创建django应用模块
1 2 | #cd /home/django/xzhu #vi django_wsgi.py |
内容如下:
1 2 3 4 | import os os.environ['DJANGO_SETTINGS_MODULE'] = 'xzhu.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() |
4、启动服务
1 2 | #/usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml #/usr/local/nginx/sbin/nginx -s reload #重启nginx服务 |
5、查看进程
1
| # ps -ef|grep uwsgi|grep -v grep
|
内容如下:
root 2429 1 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2431 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2432 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2433 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2434 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2435 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2436 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2437 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2438 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
6、监听端口
1
| # netstat -an|grep 9000
|
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
7、访问测试:
输入“http://服务器IP/”,出现it worked界面则表示成功。
输入“http://服务器IP/”,出现it worked界面则表示成功。
三、uWSGI/Django应用服务自启动
1、uWSGI启动脚本
1、uWSGI启动脚本
1 2 | #cd /home/uwsgi/ #vi uwsgiserver |
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # Check if user is root if [ $(id -u) != "0" ]; then printf "Error: You must be root to run this script!\n" exit 1 fi if [ "$1" = "start" ]; then psid=`ps aux|grep "uwsgi"|grep -v "grep"|wc -l` if [ $psid -gt 2 ];then echo "uwsgi is running!" exit 0 else /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml /usr/local/nginx/sbin/nginx -s reload fi echo "Start uwsgi service [OK]" elif [ "$1" = "stop" ];then killall -9 uwsgi echo "Stop uwsgi service [OK]" elif [ "$1" = "restart" ];then killall -9 uwsgi /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml /usr/local/nginx/sbin/nginx -s reload echo "Restart uwsgi service [OK]" else echo "Usages: uwsgiserver [start|stop|restart]" fi |
则可以通过脚本 /home/uwsgi/uwsgiserver start|stop|restart来 启动|停止|重启 uWSGI服务。
2、开机自启动uWSGI服务
在/etc/rc.d/rc.local中加入:
在/etc/rc.d/rc.local中加入:
1
| /home/uwsgi/uwsgiserver start |
相关帖子:http://briteming.blogspot.com/2017/10/pythondjango.html
---------------------------------------------------------
用Uwsgi部署Django
我用的是, 所以如下:
CentOS7 和 Python3.5yum install -y nginx yum install -y mariadb mariadb-devel mariadb-server pip3 install uwsgi
编写, nginx, mysql 配置
uwsgi
[uwsgi] socket = %d%n/django.sock chmod-socket = 666 processes = %k pidfile = %d%n/master.pid touch-logreopen = %dsplitlog.py daemonize = %d%n/run.log chdir = /website/proxy/ wsgi-file = proxy/wsgi.py virtualenv = venv # clear environment on exit # like pid or unix socket vacuum = true
然后在
/etc/nginx/conf.d/proxy.conf
中这样写server { listen 80 default_server; server_name example.com; client_max_body_size 200M; location / { include uwsgi_params; uwsgi_pass unix://app/django.sock; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-Port $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /static/ { alias /app/static/; } location /media/ { alias /app/media/; } }
uwsgi_pass。
的值和 uwsgi.ini 配置中 socket 的值必须一致配置
mysql
在
/etc/my.cnf
加入以下代码以配置默认编码为 UTF8[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
接下来三条命令
# start mariadb sudo systemctl start mariadb # Harden MySQL Server sudo mysql_secure_installation sudo systemctl enable mariadb
nginx
开机自启动
使用
vi /etc/init.d/nginx
写入如下代码#!/bin/bash # chkconfig: - 85 15 nginx=/usr/sbin/nginx conf=/etc/nginx/nginx.conf case $1 in start) echo -n "Starting Nginx" $nginx -c $conf echo " done" ;; stop) echo -n "Stopping Nginx" $nginx -s stop echo " done" ;; test) $nginx -t -c $conf ;; reload) echo -n "Reloading Nginx" $nginx -s reload echo " done" ;; restart) $0 stop $0 start ;; show) ps -aux|grep nginx ;; *) echo -n "Usage: $0 {start|restart|reload|stop|test|show}" ;; esac
然后使用三条命令:
sudo chmod +x /etc/init.d/nginx sudo chkconfig --add nginx sudo chkconfig nginx on
uwsgi
开机自启动
同理, 使用
vi /etc/init.d/uwsgi
写入#!/bin/bash # chkconfig: - 85 15 conf=配置文件路径 pid=pidfile路径 case $1 in start) cd $path uwsgi $conf ;; stop) uwsgi --stop $pid ;; show) ps -ef|grep uwsgi ;; reload) uwsgi --reload $pid ;; *) echo -n "Usage: $0 {start|restart|stop|show}" ;; esac
然后使用三条命令:
sudo chmod +x /etc/init.d/uwsgi sudo chkconfig --add uwsgi sudo chkconfig uwsgi on
最后, 使用命令。
sudo service uwsgi start
和sudo service nginx start
开启网站多站点配置方法
配置文件写法同上, 写好多个配置文件放在一个文件夹下, 以官方文档推荐的 emperor 模式运行即可, 例如我将多个配置文件放在。
那么启动它们只需要执行。
site.d
中那么启动它们只需要执行
uwsgi --emperor /website/site.d --daemonize /website/site.d/emperor.log
即可
然后在。 即可。
Nginx 里添加对应的站点配置对于多个类似配置文件, 建议使用 uwsgi 自带的变量来编写, 这样既能减少维护成本, 又方便快捷。 变量的中文文档在此 magicvars
No comments:
Post a Comment