Linux 下部署Django项目
来源:互联网 发布:智慧课堂软件 编辑:程序博客网 时间:2024/05/21 16:52
说明:本文所使用的环境为CentOS 6+Python2.7+Django1.11
安装Django、Nginx和uWSGI
1.确定已经安装了2.7版本的Python;
2.安装python-devel
yum install python-devel
3.安装uwsgi
pip install uwsgi
测试uwsgi是否能正常工作
1.新建一个index.py;
# index.pydef application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
2.uwsgi –http :8000 –wsgi-file index.py
浏览器访问8000端口看是否有hello world输出
注意:确保8000端口能被外网访问
测试Django能否正常工作
$ cd /var/www/
$ django-admin startproject mysite
$ cd mysite
$ python manage.py runserver 0.0.0.0:8000
浏览器访问8000端口看是否有hello world输出
测试uwsgi是否能和django集成
uwsgi --http :8000 --chdir=/var/www/mysite --module mysite.wsgi
or uwsgi --http :8008 --chdir /var/www/mysite --wsgi-file weixin/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192
在浏览器中访问8000端口,看能否正常访问django网站。
参数说明:
# http : 协议类型和端口号# processes : 开启的进程数量# workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)# chdir : 指定运行目录(chdir to specified directory before apps loading)# wsgi-file : 载入wsgi-file(load .wsgi file)# stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)# threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)# master : 允许主进程存在(enable master process)# daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。# daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。# vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
配置Nginx,使Nginx能为Django提供服务
在/etc/nginx/conf.d/下创建一个针对mysite项目的配置文件,详细如下:
# /etc/nginx/conf.d/mysite_nginx.conf# the upstream component nginx needs to connect toupstream django { server 127.0.0.1:8000; # for a web port socket}# configuration of the serverserver { # the port your site will be served on listen 80; # the domain name it will serve for server_name .example.com; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django 的static和 media目录 # 如果没有static或media目录,你需要先创建 location /media { alias /var/www/mysite/media; } location /static { alias /var/www/mysite/static; } # 将所有非静态文件的请求转给django server处理,这里的django server用的是uwsgi。 location / { uwsgi_pass django; include /var/www/mysite/uwsgi_params; }}#你可以从/etc/nginx/uwsgi_params复制一个拷贝到/var/www/mysite/uwsgi_params。$ cp /etc/nginx/uwsgi_params /var/www/mysite/
需要补充说明的是,在/etc/nginx/nginx.conf文件中,在最后一行的配置是include /etc/nginx/conf.d/*.conf
,也就是说,/etc/nginx/conf.d/mysite_nginx.conf是会被包含在/etc/nginx/nginx.conf中的。
重启nginx服务器,验证访问结果
/etc/init.d/nginx restart
通过浏览器访问80端口,你发现了什么?502 Bad Gateway?是不是?想一想,这是为什么呢?原因是你访问80端口时,请求的资源不是static,也不是media,这个时候Nginx就把请求转给upstream django,upstream的网关配置的127.0.0.1:8000,而127.0.0.1:8000是要靠uwsgi启动的,所以报了一个502 Bad Gateway。你,明白了吗?
注:CentOS 7启动服务的命令是systemctl restart nginx.service
启动uwsgi,再次验证结果
执行下面一个命令,启动uwsgi。 uwsgi --socket :8000 --chdir=/var/www/mysite --module mysite.wsgi
重启Nginx服务/etc/init.d/nginx restart
,再次通过浏览器访问80端口试试看。是不是成功了?
注:CentOS 7启动服务的命令是systemctl restart nginx.service
如何使uwsgi以配置文件运行?Configuring uWSGI to run with a .ini file
创建一个mysite_uwsgi.ini文件,内容如下:
[uwsgi]socket=:8000chdir = /var/www/mysite#wsgi-file = mysite/wsgi.pymodule=mysite.wsgi:applicationprocesses = 10threads = 2#django<1.4,必须指定env和moduleenv = DJANGO_SETTINGS_MODULE=mysite.settings# clear environment on exitvacuum = truesafe-pidfile = /tmp/project-master.pid # create a pidfileharakiri = 20 # respawn processes taking more than 20 secondslimit-as = 128 # limit the project to 128 MBmax-requests = 5000 # respawn processes after serving 5000 requestsdaemonize = /var/log/uwsgi/mysite.log # background the process & log
执行命令uwsgi --ini mysite_uwsgi.ini
即可运行
如何以Emperor模式运行?
什么是Emperor模式?,官网说的很清楚,如下:
uWSGI can run in ‘emperor’ mode. In this mode it keeps an eye on a directory of uWSGI config files, and will spawn instances (‘vassals’) for each one it finds.
Whenever a config file is amended, the emperor will automatically restart the vassal.
按下面的步骤操作,即可以Emperor模式运行uwsgi:
1. create a directory for the vassals sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
2. symlink from the default config directory to your config file sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
3. run the emperor uwsgi --emperor /etc/uwsgi/vassals --uid nginx --gid nginx
如何创建uwsgi服务?
在Linux中,一个服务其实就是一个shell脚本。在CenOS6中,服务脚本一般都在/etc/init.d/目录下。
首先我们在/etc/initd/目录下创建一个uwsgi文件,文件内容如下:
#!/bin/sh#### BEGIN INIT INFO# Provides: uwsgi# Required-Start: $syslog $remote_fs# Should-Start: $time ypbind smtp# Required-Stop: $syslog $remote_fs# Should-Stop: ypbind smtp# Default-Start: 3 5# Default-Stop: 0 1 2 6### END INIT INFO# Source function library.. /etc/rc.d/init.d/functions# Check for missing binaries (stale symlinks should not happen)UWSGI_BIN="/usr/local/bin/uwsgi"UWSGI_EMPEROR_MODE=trueUWSGI_VASSALS="/etc/uwsgi/vassals/"UWSGI_OPTIONS="--uid nginx --gid nginx --logto /var/log/uwsgi/uwsgi.log"lockfile=/var/lock/subsys/uwsgiUWSGI_OPTIONS="$UWSGI_OPTIONS --autoload"if [ "$UWSGI_EMPEROR_MODE" = "true" ] ; then UWSGI_OPTIONS="$UWSGI_OPTIONS --emperor $UWSGI_VASSALS"ficase "$1" in start) echo "Starting uWSGI ... " daemon $UWSGI_BIN $UWSGI_OPTIONS & ;; stop) echo "Shutting down uWSGI ... " killproc $UWSGI_BIN ;; restart) $0 stop $0 start ;; status) echo -n "Checking for service uWSGI " status $UWSGI_BIN ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 ;;esacexit 0
然后,我们可以使用此脚本来管理uwsgi,如下:
/etc/init.d/uwsgi start
/etc/init.d/uwsgi stop
/etc/init.d/uwsgi restart
/etc/init.d/uwsgi status
需要注意的是,日志文件夹的所属权应该归配置文件中指定的用户nginx $ chown nginx.nginx /var/log/uwsgi -R
如何设置开机起动uwsgi?
把启动uwsgi的命令添加到“/etc/rc.local”文件中即可。
多站点部署问题
#Simple HTTP serverserver { listen 80; root /usr/share/nginx/www; server_name host1.example.com;}#Django serverserver { listen 80; server_name host2.example.com; #...upstream config...}
详细请参考:https://stackoverflow.com/questions/7942961/how-to-run-multiple-django-sites-on-nginx-and-uwsgi
参考文档:http://python.usyiyi.cn/translate/django_182/howto/deployment/wsgi/uwsgi.html
http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
- Linux 下部署Django项目
- linux下通过Nginx部署django项目
- ubuntu下部署Django项目(成功)
- Ubuntu下Django+uwsgi+nginx项目部署
- Linux下部署项目
- linux上部署Django项目(Apache+mod_wsgi+django)
- linux下django部署到apache
- linux下nginx uwsgi方式部署django
- Linux下uWSGI+NGINX部署Django+AngularJs
- Linux 下部署web项目
- Linux环境下项目部署
- Linux下部署项目步骤
- Linux下部署web项目
- linux下部署tomcat项目
- Linux下Java项目部署
- linux下部署web项目
- Linux下部署Web项目
- linux下部署web项目
- mysql出现主从同步延迟有哪些原因?如何解决?
- C#入门经典 学习笔记(三)
- jmeter应用java包
- loadrunner中浏览器缓存设置
- 关于微信获取access_token接口,返回值为-1000的问题
- Linux 下部署Django项目
- Android onTouchEvent,dispatchTouchEvent,onInterceptTouchEvent分析
- SELinux之一:SELinux基本概念及基本配置
- Codevs 1344 线型网络 模拟退火
- OC 实例变量(instance var)与属性(@property)的关系
- 加载控制器View的方式以及控制器View的生命周期
- 解决Cordova开发的iOS的app界面被状态栏覆盖
- C# 读取excel日期时获取到数字转换成日期
- Tomcat Server.xml详解