Django uwsgi Nginx 的生产环境部署详解
配置生产环境
#setting.py文件中 DEBUG=False#生产环境 #允许访问的域名,域名前加一个点表示允许访问该域名下的子域名,比如www.zmrenwu.com、 #test.zmrenwu.com等二级域名同样允许访问。如果不加前面的点则只允许访问zmrenwu.com ALLOWED_HOSTS=["127.0.0.1",".blogzjl.site"]
创建Python虚拟环境
安装virtualenv
sudopip3installvirtualenv
克隆Python的环境
#先到指定目录下运行,我的虚拟环境是在blogzjl.site目录下 #指定--python=python3克隆Python3的环境 virtualenv--python=python3env #进入虚拟环境 source/home/zjl/sites/blogzjl.site/env/bin/activate #用户名前,会出现(env)zjl@,表示进入 #后面基本上都是在虚拟环境中完成的
收集静态文件
先在settings中配置STATIC_ROOT=os.path.join(BASE_DIR,'static')
同时在mysite_nginx.conf中将静态文件的路径改为static的绝对路径
#在settings中配置 #STATIC_ROOT指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的static文件夹 STATIC_ROOT=os.path.join(BASE_DIR,'static') #在命令行输入 python3manage.pycollectstatic#将静态文件copy到统一的目录static下
uwsgi配置
安装uwsgi
pip3installuwsgi #可能需要更新pip才能安装,根据提示输入命令更新 pipinstall--upgradepip
测试uwsgi
在项目目录下执行
uwsgi--http127.0.0.1:8080--fileBlogProject/wsgi.py--static-map=/static=static #--http这个就和runserver一样指定IP端口 #--fileDjango项目中wsgi.py文件的路径,和setting.py在同一个目录下 #--static做一个映射,指定静态文件 #可能会启动/访问失败,请检查端口是否占用,file或static路径是否正确 #使用命令netstat-nultp查看端口使用情况 #关掉相关经常killall-9uwsgi或kill-9进程号
执行Linux命令curlhttp://127.0.0.1:8080访问,查看是否是访问成功后的页面(可以启动DEBUG对错误页面的相关调试)
配置文件
相当于将uwsgi--http127.0.0.1:8080--fileBlogProject/wsgi.py--static-map=/static=static这一长串命令配置到文件里,简化以后的启动命令
在自定义目录或项目主目录下创建uwsgi配置文件:blogzjl_uwsgi.ini(自定义命名,以.ini结束),我这里是在/home/zjl/sites/blogzjl.site/blogzjl/
路径下自定义的一个目录script存放所有配置(包括nginx)相关的文件
[uwsgi] #thelocalunixsocketfilethancommnuincatetoNginx socket=/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock #项目路径 chdir=/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/ #Django'swsgifile项目中wsgi的位置 wsgi-file=BlogProject/wsgi.py #进程相关设置 #进程数同processes worker=5 #processes=4 #线程数 #threads=2 #指定静态文件 static-map=/static=/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static #主进程启动 master=true pidfile=/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.pid #static-map=/static=/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static #启动uwsgi的用户名和用户组 uid=zjl gid=zjl #启用线程 enable-threads=True #设置自中断时间 harakir=30 #设置缓冲 post-buffering=4096 #设置后台运行 daemonize=/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.log #monitoruwsgistatus #stats=127.0.0.1:9191 #clearenvironmentonexit退出时清除环境 vacuum=true
uwsgi执行的相关命令
#启动命令 #在项目目录下 uwsgi--ini../script/blogzjl-uwsgi.ini #停止 uwsgi--stop../script/uwsgi.pid #重启 uwsgi--reload../script/uwsgi.pid #uwsgi.pid为配置文件中pidfile设置的值,用来控制uwsgi重启或停止,
uwsgi相关配置文件参数
master=true #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。 chdir=/web/www/mysite #在app加载前切换到当前目录,指定运行目录 module=mysite.wsgi #加载一个WSGI模块,这里加载mysite/wsgi.py这个模块 py-autoreload=1 #监控python模块mtime来触发重载(只在开发时使用) lazy-apps=true #在每个worker而不是master中加载应用 socket=/test/myapp.sock #指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字 processes=2#启动2个工作进程,生成指定数目的worker/进程 buffer-size=32768 #设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。 daemonize=/var/log/myapp_uwsgi.log #使进程在后台运行,并将日志打到指定的日志文件或者udp服务器 log-maxsize=5000000#设置最大日志文件大小 disable-logging=true#禁用请求日志记录 vacuum=true#当服务器退出的时候自动删除unixsocket文件和pid文件。 listen=120#设置socket的监听队列大小(默认:100) pidfile=/var/run/uwsgi.pid#指定pid文件 enable-threads=true #允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程 reload-mercy=8 #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束) max-requests=5000 #为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏 limit-as=256 #通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。 harakiri=60 #一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
nginx配置
安装nginx
#安装nginx sudoaptinstallnginx #测试是否安装成功 sudo/etc/init.d/nginxstart #访问域名或地址,出现欢迎界面 #重启 sudo/etc/init.d/nginxrestart #重载 sudo/etc/init.d/nginxreload #停止 sudo/etc/init.d/nginxstop
配置文件
在在前面自定义的script目录下创建blogzjl_nginx.conf(文件名以nginx结尾),同时做一个软连接,把此文件生成一个快捷方式到/etc/nginx/site-enabled/目录下
#nginxifconfig_file server{ #监听端口 listen80; #服务器的域名或ip server_name.blogzjl.site;#substituteyourmachine'sIPaddressorFQDN charsetutf-8; #存放日志文件 access_log/var/log/nginx/blogzjl_access.log; #error_log/var/log/nginx/blogzjl_error.logerror; gzip_typestext/plainapplication/x-javascripttext/csstext/javascriptapplication/x-httpd-phpapplication/jsontext/jsonimage/jpegimage/gifimage/pngapplication/octet-stream;#支持压缩的类型 #最大上传 client_max_body_size75M; #Django媒体相关文件 #location/media{ #alias/;#yourDjangoproject'smediafiles-amendasrequired #} #Django静态相关文件 location/static/{ alias/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static/;#yourDjangoproject'sstaticfiles-amendasrequired #indexindex.htmlindex.htm; expires30d; } #所有非媒体、静态相关通过uwsgi交给Django服务器处理 location/{ includeuwsgi_params;#theuwsgi_paramsfileyouinstalled uwsgi_read_timeout60; uwsgi_send_timeout60; uwsgi_passunix:/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock; } }
创建软连接
ln-s/home/zjl/sites/blogzjl.site/blogzjl/script/blogzjl_nginx.conf/etc/nginx/site-enabled #ln-s源文件绝对目标文件绝对路径 #到/etc/nginx/site-enabled/目录下将default文件删除防止其覆盖blogzjl_nginx.conf中的配置
启动nginx和uwsgi
在启动前最好查看端口号,将相关进程关掉
#查看端口 netstat-nultp #关掉相关进程,最好关彻底,相关端口被占用的都关掉,或自行换一个端口 killall-9uwsgi killall-9nginx #对于还没有关掉的 kill-9进程号
最后启动uwsgi和nginx
#在项目目录下执行 #启动uwsgi uwsgi--ini../script/blogzjl-uwsgi.ini #启动nginx /etc/init.d/nginxstart
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。