使用systemd在启动时启动Nginx


18

我刚刚在Debian 8服务器上安装了nginx 1.9。当我告诉它运行时,nginx可以正常工作,但它似乎不会在启动时自动加载nginx。

我已经尝试了Internet上推荐的众多初始化脚本,但是还没有任何效果。所以现在我想用systemctl弄清楚。

~$ systemctl status nginx
● nginx.service
   Loaded: masked (/dev/null)
   Active: inactive (dead)
~$ sudo systemctl try-restart nginx
Failed to try-restart nginx.service: Unit nginx.service is masked.
~$ sudo systemctl reload nginx
Failed to reload nginx.service: Unit nginx.service is masked.
~$ sudo systemctl reload nginx
Failed to reload nginx.service: Unit nginx.service is masked.

不幸的是,我不知道“服务被屏蔽”的含义,也不知道为什么它被屏蔽了。

当我跑步时

sudo nginx

服务器运行正常。因此,我研究了对Nginx服务的屏蔽。

~$ sudo systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.

好的,很酷,现在我可以使用systemctl启动nginx了。因此,我检查了重启是否会自动加载nginx。但这没有做到,我也不知道从这里出发。

有人可以帮助我让Nginx在启动时自动运行吗?


6
systemctl enable nginx...
jasonwryan

Answers:


21

您似乎混淆了启用,启动和屏蔽操作。

  • systemctl startsystemctl stop:开始(停止)的单元中的问题立即 ;
  • systemctl enablesystemctl disable:标记(取消标记)要在引导时自动启动的单元(以特定于单元的方式,如本[Install]节所述);
  • systemctl masksystemctl unmask::禁止(允许)尝试启动有问题的单元(手动或作为任何其他单元的依赖项,包括默认引导目标的依赖项)。请注意,在systemd中标记为自动启动是通过将默认引导目标中的人为依赖项添加到相关单元来实现的,因此“掩码”也不允许自动启动。

因此,这些都是不同的操作。其中,您要systemctl enable

参考:systemctl(1)

更多:Lennart Poettering(2011-03-02)。 “关闭的三个级别”systemd适用于管理员。0pointer.de。


我只希望nginx在启动时加载。我认为systemctl可以帮助我弄清楚为什么它没有发生。
2015年

@ j0h:重新阅读我的答案。我已经描述了为什么它不自动启动以及如何使其自动启动。提示:最后一句话。
intelfx 2015年

链接重定向到404页面,我使用systemctl启用nginx。重新启动后,它仍然没有运行。也许我应该尝试systemctl enable nginx.service
j0h,2015年

1
@ j0h:我的意思是句子,不是参考。(顺便说一句,对不起,链接断开了,现在已修复。)是的,再次阅读一遍,您需要systemctl enable(不需要systemctl start)使启动时启动。
intelfx

2

修复了已接受答案中的链接,以便将其重定向到正确的页面。但这是相关的一点:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service
sudo systemctl status nginx.service

在那里/lib/systemd/system/nginx.service看起来类似:

# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

`

使用期限,而不是退出,以防止Nginx的离开陈旧的Unix套接字和失败,下次启动(trac.nginx.org/nginx/ticket/753
danger89

2

这是对我有用的东西:https ://web.archive.org/web/20150328063215/https: //longhandpixels.net/blog/2014/02/install-nginx-debian-ubuntu

我忽略了大多数文档(专门用于编译其他版本的Nginx),然后转到“使它自动启动”。

我按照那里的指示进行操作,现在当我重新启动时,nginx 1.9正在运行。

我非常感谢大家的帮助和见解。谢谢你们!


4
请不要仅仅将链接作为答案:添加相关信息,以使答案不依赖于外部资源...
jasonwryan 2015年

4
实际上,现在外部资源已经消失了...在web.archive上查看:web.archive.org/web/20150328063215/https
重写

1

来自nginx资源https://www.nginx.com/resources/wiki/start/topics/examples/systemd/

echo "
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
" > /lib/systemd/system/nginx.service
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.