上次学到了在云服务器下如何部署Django
项目,用到了nginx
服务和uwsgi
服务,需要手工启动这2个服务的命令。
现在考虑如何设置开机自启动,为什么要这样考虑?因为服务器万一出问题,意外重启了,那我们部署的Django
项目不就挂了吗?到时候还是要人工去启动吗?
所以最好还是配置开机自启动以防万一。
网上查了很多开机自启动配置,最后选择:修改系统文件 /etc/rc.d/rc.local
,添加启动命令脚本。
测试过程中,发现nginx
服务自启动比较容易,直接添加就行。但是发现 uwsgi
服务,配置该服务开机自启几种方式,reboot
后,导致云服务器挂掉,无法再登录,只能通过云服务官网重启才能进入,所以谨慎操作!!!
经过多次测试和网上经验总结,确定了一个可行方案:
在 /etc/init.d/
路径下面,建立 uwsgi.sh
启动命令脚本,注意“一定要放到 /etc/init.d/
路径下面!!!”,其他路径容易导致云服务器挂掉,我试过多次了。
vim /etc/init.d/uwsgi.sh
添加如下内容:注意“执行命令的文件一定要用绝对路径!!!”
#!/bin/bash
/usr/python3/bin/uwsgi --ini /home/django_pro/mysite/uwsgi.ini;
esc
退出编辑,:wq
保存修改
将 /etc/init.d/uwsgi.sh
修改为可执行
chmod 777 /etc/init.d/uwsgi.sh
/etc/rc.d/rc.local
上。vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
#开机自启动 nginx 服务
/usr/sbin/nginx
#开机自启动 uwsgi 服务,一定要用绝对路径执行该sh
/etc/init.d/uwsgi.sh
esc
退出编辑,:wq
保存修改
将rc.local
修改为可执行
chmod 777 /etc/rc.d/rc.local
reboot
重启检验结果[root@~]# ps -ef|grep uwsgi
root 1056 1 0 16:23 ? 00:00:00 /usr/python3/bin/uwsgi --ini /home/django_pro/mysite/uwsgi.ini
root 1408 1056 0 16:23 ? 00:00:00 /usr/python3/bin/uwsgi --ini /home/django_pro/mysite/uwsgi.ini
root 1572 1473 0 16:48 pts/0 00:00:00 grep --color=auto uwsgi
[root@~]# ps -ef|grep nginx
root 1017 1 0 16:23 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 1023 1017 0 16:23 ? 00:00:00 nginx: worker process
root 1574 1473 0 16:49 pts/0 00:00:00 grep --color=auto nginx
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
脚本解释:
Unit:服务的启动顺序和依赖关系
Description:对该服务的描述;
After:在b.target服务组启动后,再启动本服务;
Service:服务具体执行的方式
ExecStart,ExecStop,ExecReload等:启动命令组,分别是服务启动时,停止时,重启时,启动前,启动后,停止后执行的命令;
Type:服务启动类型。默认simple表示ExecStart为主进程,notify类似于simple,启动结束后会发出通知信号。另外还有forking,oneshot,dbus,idle等类型;
Install:把服务放在哪个服务组
WantedBy:服务所在的服务组。
更多请参考 systemd的.service服务文件配置
设置开机自启动
systemctl enable nginx.service
查看是否正确启动
systemctl list-unit-files |grep nginx
看下如下图就成功启动了
启动nginx:
systemctl start nginx.service
其他常用命令
开启开机自启动:
systemctl enable nginx.service
停止开机自启动 :
systemctl disable nginx.service
启动 nginx 服务 :
systemctl start nginx.service
停止 nginx 服务 :
systemctl stop nginx.service
重启 nginx 服务 :
systemctl restart nginx.service
查看服务当前状态 :
systemctl status nginx.service
查看所有已启动的服务 :
systemctl list-units --type=service
[Unit]
Description=uwsgi - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/home/zhang/QuBian/start_uwsgi.sh
ExecStop=/home/zhang/QuBian/stop_uwsgi.sh
[Install]
WantedBy=multi-user.target
ExecStart
和ExecStop
指定了两个.sh
文件,用于配置uwsgi
的启动和停止命令
/home/zhang/QuBian
目录下新建start_uwsgi.sh
文件和stop_uwsgi.sh
文件,内容分别如下:start_uwsgi.sh
文件
#!/bin/sh
/root/.virtualenvs/qubian/bin/uwsgi --ini /home/zhang/QuBian/uwsgi.ini
stop_uwsgi.sh
文件
#!/bin/sh
/root/.virtualenvs/qubian/bin/uwsgi --stop /home/zhang/QuBian/uwsgi.pid
/root/.virtualenvs/qubian/bin/uwsgi是因为我这里有虚拟环境,需要使用到虚拟环境下的uwsgi命令,相当于先workon qubian进入到qubian虚拟环境再使用uwsgi --stop uwsgi.pid
如果你的uwsgi
是在虚拟环境中使用pip
来安装的,可以使用whereis uwsgi
来查看uwsgi
在虚拟环境下的目录
最后将这两个 .sh
文件添加可执行权限 chmod a+x start_uwsgi.sh stop_uwsgi.sh
uwsgi
设置开机自启动
systemctl enable uwsgi.service
查看是否正确启动 systemctl list-unit-files |grep uwsgi
看下如下图就成功启动了
启动uwsgi
:systemctl start uwsgi.service
到这里就完成了,再次重启服务器时会自动启动运行nginx
和uwsgi
了,妈妈再也不担心我要手动启动了~
参考文章
uwsgi开机自启
nginx开机自启
湿透剪自布
ubuntu设置uwsgi和nginx开机自启(在虚拟环境下启动)
PandaCode辉
nginx服务和uwsgi服务如何设置开机自启动