标签:root 安装 执行 必须 exist 返回 hello group 守护
uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回。
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
nginx 和 uWSGI交互就必须使用同一个协议,而上面说了uwsgi支持fastcgi、uwsgi、http协议,这些都是nginx支持的协议,只要大家沟通好使用哪个协议,就可以正常运行了。
注意安装uwsgi不需要在python的虚拟环境下
[root@web Python-3.7.1]# pwd /usr/src/Python-3.7.1 [root@web Python-3.7.1]# ls aclocal.m4 Include Modules python build install-sh myweb Python CODE_OF_CONDUCT.rst Lib Objects python-config config.guess libpython3.7m.a Parser python-config.py config.log LICENSE PC python-gdb.py config.status m4 PCbuild README.rst config.sub Mac profile-run-stamp setup.py configure Makefile Programs Tools configure.ac Makefile.pre pybuilddir.txt web Doc Makefile.pre.in pyconfig.h Grammar Misc pyconfig.h.in [root@web Python-3.7.1]# pip3 install uwsgi Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting uwsgi Downloading https://mirrors.aliyun.com/pypi/packages/e7/1e/3dcca007f974fe4b369bf1b8629d5e342bb3055e2001b2e5340aaefae7a/uwsgi-2.0.18.tar.gz (801 kB) |████████████████████████████████| 801 kB 1.2 MB/s Installing collected packages: uwsgi Running setup.py install for uwsgi ... done Successfully installed uwsgi-2.0.18 [root@web Python-3.7.1]#
?
[root@web Python-3.7.1]# mkdir /etc/uwsgi [root@web Python-3.7.1]# vi /etc/uwsgi/uwsgi.ini [uwsgi] uid = root gid = root socket = 127.0.0.1:9090 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 = /var/log/uwsgi9090.log #保存退出,注意配置文件不要留注释,会出错,出错信息在/var/run/log里查看uwsgi9090.log ? #建立软连接 [root@web Python-3.7.1]# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
?
相关解释
[uwsgi] uid = root gid = root socket = 127.0.0.1:9090 //#配置和nginx连接的socket连接 master = true //启动主进程 vhost = true //多站模式 no-site = true //多站模式时不不设置入口模块和文件 workers = 2 //子进程数 reload-mercy = 10 //平滑的重启 vacuum = true //退出、重启时清理文件 max-requests = 1000 //开启10000个进程后, 自动respawn下 limit-as = 512 // 将进程的总内存量控制在512M buffer-size = 30000 pidfile = /var/run/uwsgi9090.pid //pid文件,用于下面的脚本启动、停止该进程 daemonize = /var/log/uwsgi9090.log ? #增加补充 [uwsgi] #使用nginx连接时, 监控地址 #socket=127.0.0.1:8080 #直接做web服务器时, 所监控地址 http=127.0.0.1:8080 #项目所在目录 chdir=/home/Desktop/myproject #项目中wsgi.py文件的目录,相对于项目目录, wsgi-file=myproject/wsgi.py ? #wsgi-file与module参数效果一致,可以写成module = myproject/wsgi.py 或者module=myproject.wsgi ? # Django s wsgi file module = su.wsgi #su是项目名,可以ls检查看看 ? # 工作进程线程 processes=4 threads=2 # 是否需要主进程 master=True # 保存主进程pid文件 pidfile=uwsgi.pid # 设置项目为守护运行, 保存运行日志文件所在位置 daemonize=uwsgi.log # 设置虚拟环境所在位置home/virtualenv都可以,都是设置虚拟环境所在位置的 virtualenv=/Users/smart/.virtualenvs/myproject ? #home 指明你的虚拟解释器的第一层路径
[root@web Python-3.7.1]# uwsgi --ini /etc/uwsgi/uwsgi.ini [uWSGI] getting INI configuration from /etc/uwsgi/uwsgi.ini ?
显示 [uWSGI] getting INI configuration from uwsgi.ini 表明uwsgi运行成功。
通过 ps -aux|grep uwsgi 查看确认是否uwsgi启动。
[root@web src]# ps aux |grep uwsgi root 15391 0.2 0.1 160052 5868 ? S 17:31 0:00 uwsgi --ini /etc/uwsgi/uwsgi.ini root 15392 0.1 0.1 182492 7200 ? S 17:31 0:00 uwsgi --ini /etc/uwsgi/uwsgi.ini root 15393 0.1 0.1 182492 7200 ? S 17:31 0:00 uwsgi --ini /etc/uwsgi/uwsgi.ini root 15395 0.0 0.0 112712 964 pts/1 R+ 17:31 0:00 grep --color=auto uwsgi
?
补充:
运行简单的uWSGI
#启动一个python uwsgi --http :8000 --wsgi-file test.py ? http :8000: 使用http协议,端口8000 wsgi-file test.py: 加载指定的文件,test.py ? #test.py def application(env, start_response): start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)]) return [b"Hello World"] # python3
uWsgi热加载python程序
在启动命令后面加上参数 uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 #发布命令 command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi #此时修改django代码,uWSGI会自动加载django程序,页面生效
运行django程序
#mysite/wsgi.py 确保找到这个文件 uwsgi --http :8000 --module mysite.wsgi module mysite.wsgi: 加载指定的wsgi模块
#如果你已经配置了nginx(启动了nginx服务,配置了uwsgi_pass),请用这个socket连接 #socket = 0.0.0.0:8000
#如果你没用nginx,想通过uwsgi直接启动web服务,指明http协议 http = 0.0.0.0:9999
[root@web Python-3.7.1]# cat /var/run/uwsgi9090.pid 15391 [root@web Python-3.7.1]# kill -9 15391
错误解决
cat /var/log/uwsgi9090.log 有错误 ### WARNING: you are running uWSGI as root !!! (use the --uid flag) 意思是不建议用root启动uwsgi,使用root运行了这个程序,带来了一些安全隐患,需要处理。
解决
增加用户和组,具体命令如下:
/usr/sbin/groupadd www /usr/sbin/useradd -g www www
增加了www的用户名和组,之后修改uWsgi配置文件:
[uwsgi] uid = www gid = www
uwsgi 启动命令太长,用脚本进行简化
添加脚本
vi /etc/init.d/uwsgi ,init脚本内容如下所示:
#!/bin/sh DESC="uwsgi daemon" NAME=uwsgi DAEMON=/usr/local/bin/uwsgi CONFIGFILE=/etc/uwsgi/$NAME.ini PIDFILE=/var/run/${NAME}9090.pid SCRIPTNAME=/etc/init.d/$NAME FIFOFILE=/tmp/uwsgififo set -e [ -x "$DAEMON" ] || exit 0 ? do_start() { if [ ! -f $PIDFILE ];then $DAEMON $CONFIGFILE || echo -n "uwsgi running" else echo "The PID is exist..." fi } ? do_stop() { if [ -f $PIDFILE ];then $DAEMON --stop $PIDFILE || echo -n "uwsgi not running" rm -f $PIDFILE echo "$DAEMON STOPED." else echo "The $PIDFILE doesn‘t found" fi } ? do_reload() { if [ -p $FIFOFILE ];then echo w > $FIFOFILE else $DAEMON --touch-workers-reload $PIDFILE || echo -n "uwsgi can‘t reload" fi } ? do_status() { ps aux|grep $DAEMON } ? case "$1" in status) echo -en "Status $NAME: \n" do_status ;; start) echo -en "Starting $NAME: \n" do_start ;; stop) echo -en "Stopping $NAME: \n" do_stop ;; reload|graceful) echo -en "Reloading $NAME: \n" do_reload ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2 exit 3 ;; esac exit 0 ?
DAEMON=/usr/local/bin/uwsgi #指向uwsgi的命令路径 CONFFILE=/etc/uwsgi/$NAME.ini #uwsgi.ini配置文件路径 PIDFILE=/var/run/${NAME}9090.pid #pid文件路径 SCRIPTNAME=/etc/init.d/$NAME #启动脚本路径
授权使用脚本
[root@web Python-3.7.1]# chmod 755 /etc/init.d/uwsgi ?
使用脚本关闭uwsgi
[root@web src]# /etc/init.d/uwsgi stop Stopping uwsgi: /usr/local/bin/uwsgi STOPED.
使用脚本启动uwsgi
[root@web src]# /etc/init.d/uwsgi start Starting uwsgi: [uWSGI] getting INI configuration from /etc/uwsgi/uwsgi.ini
?
查看uwsgi状态
[root@web src]# /etc/init.d/uwsgi status Status uwsgi: root 15770 0.0 0.0 112712 948 pts/1 R+ 22:50 0:00 grep /usr/local/bin/uwsgi [root@web src]#
?
查看端口是否使用
[root@web src]# netstat -ntpl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN 15776/uwsgi tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11223/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 878/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1164/master tcp6 0 0 :::3306 :::* LISTEN 18005/mysqld tcp6 0 0 :::22 :::* LISTEN 878/sshd tcp6 0 0 ::1:25 :::* LISTEN 1164/master
[root@web src]# chkconfig --add /etc/init.d/uwsgi service uwsgi does not support chkconfig ? # ‘service uwsgi does not support chkconfig‘ 如果出现了这样的报错,是因为添加脚本用service启动,必须要脚本里面包含这2行注释: # chkconfig: - 85 15 # description: nginx is a World Wide Web server. It is used to serve
在/etc/init.d/uwsgi添加
[root@web src]# vi /etc/init.d/uwsgi #!/bin/sh # chkconfig: - 85 15 # description: nginx is a World Wide Web server. It is used to serve ? ? DESC="uwsgi daemon" NAME=uwsgi DAEMON=/usr/local/bin/uwsgi CONFIGFILE=/etc/uwsgi/$NAME.ini PIDFILE=/var/run/${NAME}9090.pid SCRIPTNAME=/etc/init.d/$NAME FIFOFILE=/tmp/uwsgififo set -e [ -x "$DAEMON" ] || exit 0 -- INSERT -- ....
重新添加脚本为开机启动
[root@web src]# chkconfig --add /etc/init.d/uwsgi [root@web src]# chkconfig --level 2345 uwsgi on #指定指定读系统服务要在哪一个执行等级中开启或关毕 ? ? --level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关毕。 等级0表示:表示关机 等级1表示:单用户模式 等级2表示:无网络连接的多用户命令行模式 等级3表示:有网络连接的多用户命令行模式 等级4表示:不可用 等级5表示:带图形界面的多用户模式 等级6表示:重新启动
查看开机启动的脚本列表
[root@web src]# chkconfig --list ? Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. ? If you want to list systemd services use ‘systemctl list-unit-files‘. To see services enabled on particular target use ‘systemctl list-dependencies [target]‘. ? netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off uwsgi 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@web src]#
?
http { ... server { listen 8000; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_SCRIPT myweb.wsgi; uwsgi_param UWSGI_CHDIR /usr/local/nginx/website/myweb; index index.html index.htm; client_max_body_size 35m; #uwsgi_cache_valid 1m; #uwsgi_temp_file_write_size 64k; #uwsgi_busy_buffers_size 64k; #uwsgi_buffers 8 64k; #uwsgi_buffer_size 64k; #uwsgi_read_timeout 300; #uwsgi_send_timeout 300; #uwsgi_connect_timeout 300; } ? location /static { alias /usr/local/website/myweb/statics; } } }
注释
uwsgi_pass 127.0.0.1:9090; // 必须与uwsgi配置一致 uwsgi_param UWSGI_CHDIR /usr/local/nginx/website/myweb; // 项目根目录 uwsgi_param UWSGI_SCRIPT myweb.wsgi; // 入口文件,即wsgi.py相对项目根目录的位置
针对django的静态文件设置
location /static { alias /usr/local/website/myweb/statics; }
注意项目文件不要放在/root/目录下,root目录权限不足
测试nginx配置文件修改是否正确
[root@web ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@web ~]# ?
[root@web ~]# /etc/init.d/uwsgi start ? ? #启动nginx [root@web ~]# /usr/local/nginx/sbin/nginx -s stop [root@web ~]# lsof -i :80 [root@web ~]# /usr/local/nginx/sbin/nginx ? [root@web ~]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 16016 root 6u IPv4 259564 0t0 TCP *:http (LISTEN) nginx 16017 nobody 6u IPv4 259564 0t0 TCP *:http (LISTEN) [root@web ~]#
?
测试,出现500内部错误,一般都是项目的问题
查看错误日志
[root@web ~]# tailf /var/log/uwsgi9090.log unable to load app 0 (mountpoint=‘192.168.199.169|‘) (callable not found or import error) --- no python application found, check your startup logs for errors --- 192.168.199.169 [pid: 16007|app: -1|req: -1/3] 192.168.199.168 () {46 vars in 807 bytes} [Sun Feb 23 02:50:43 2020] GET / => generated 21 bytes in 1 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0) Traceback (most recent call last): File "/usr/local/website/myweb/myweb/wsgi.py", line 12, in <module> from django.core.wsgi import get_wsgi_application ModuleNotFoundError: No module named ‘django‘ unable to load app 0 (mountpoint=‘192.168.199.169|‘) (callable not found or import error) --- no python application found, check your startup logs for errors --- 192.168.199.169 [pid: 16007|app: -1|req: -1/4] 192.168.199.168 () {46 vars in 754 bytes} [Sun Feb 23 02:50:43 2020] GET /favicon.ico => generated 21 bytes in 1 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0) ?
分析:ModuleNotFoundError: No module named ‘django‘,
django模块没导入,由于django模块是装在虚拟环境中的,所以需要在uwsgi指定python虚拟环境的包的安装位置
[root@web python3.7]# cd site-packages/ [root@web site-packages]# ls asgiref pytz-2019.3.dist-info asgiref-3.2.3.dist-info setuptools django setuptools-45.2.0.dist-info Django-2.1.8.dist-info setuptools-45.2.0.virtualenv easy_install.py sqlparse pip sqlparse-0.3.0.dist-info pip-20.0.2.dist-info wheel pip-20.0.2.virtualenv wheel-0.34.2.dist-info pkg_resources wheel-0.34.2.virtualenv pytz [root@web site-packages]# pwd /usr/src/Python-3.7.1/web/lib/python3.7/site-packages ?
找到django的安装位置
修改uwsgi配置文件,增加pythonpath项,保存重启uwsgi
[root@web ~]# vi /etc/uwsgi/uwsgi.ini [uwsgi] uid = www gid = www socket = 127.0.0.1:9090 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 = /var/log/uwsgi9090.log pythonpath = /usr/src/Python-3.7.1/web/lib/python3.7/site-packages ?
(3)测试
/etc/init.d/uwsgi stop /etc/init.d/uwsgi start netstat -ntpl # 查看服务状态 ? /usr/local/nginx/sbin/nginx # 启动nginxs
成功访问django的默认页
参考资料
[1]:https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Options.html
部署基于python的web发布环境(第三篇):环境部署4:centos7安装uwsgi、发布网站
标签:root 安装 执行 必须 exist 返回 hello group 守护
原文地址:https://www.cnblogs.com/Nicholas0707/p/12384572.html