Nginx:Nginx.service的作业失败,因为控制进程已退出


77

我遇到了一个问题,我已经尝试解决了几天,但我不知道该怎么办,一直在寻找答案,但是我发现的所有问题都没有帮助我。

我在这里有点陌生,我真的希望有人能帮助我。您可以告诉我我需要提供哪些信息,以期找到解决方案。

$ systemctl status nginx.service
nginx.service - Startup script for nginx service
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2016-03-08 13:23:35 GMT; 2min 20s ago

Mar 08 13:23:33 startdedicated.com nginx[8315]: nginx: [emerg] bind() to ------------ f...e)
Mar 08 13:23:33 startdedicated.com nginx[8315]: nginx: [emerg] bind() to ----- f...e)
Mar 08 13:23:34 startdedicated.com nginx[8315]: nginx: [emerg] bind() to ----- f...e)
Mar 08 13:23:34 startdedicated.com nginx[8315]: nginx: [emerg] bind() to ----- f...e)
Mar 08 13:23:35 startdedicated.com nginx[8315]: nginx: [emerg] bind() to ----- f...e)
Mar 08 13:23:35 .startdedicated.com nginx[8315]: nginx: [emerg] still could not bind()
Mar 08 13:23:35 startdedicated.com systemd[1]: nginx.service: control process exited, code=...=1
Mar 08 13:23:35 startdedicated.com systemd[1]: Failed to start Startup script for nginx service.
Mar 08 13:23:35 startdedicated.com systemd[1]: Unit nginx.service entered failed state.
Mar 08 13:23:35 startdedicated.com systemd[1]: nginx.service failed.

1
请张贴您的nginx.conf和:“ nginx -t”输出...
— user2925795

prntscr.com/acoayr就是这里。我无法发布代码,因此我不得不截屏。
— daliborsb '16

请发布您的服务器块配置和:“ nginx -t”输出...您是否尝试过重启nginx?“服务nginx重新启动”
— user2925795

nginx -t输出nginx:配置文件/etc/nginx/nginx.conf语法正常nginx:配置文件/etc/nginx/nginx.conf测试成功,我尝试重新启动,这就是我得到的:falcon170:〜#service nginx restart重新启动nginx(通过systemctl):nginx.service的作业失败,因为控制进程退出并显示错误代码。有关详细信息,请参见“ systemctl status nginx.service”和“ journalctl -xe”。[失败]
— daliborsb '16

查看/var/log/nginx/errors.log。有关于失败的所有信息。
— Adizbek Ergashev

Answers:


119

尝试运行以下两个命令:

sudo fuser -k 80/tcp

sudo fuser -k 443/tcp

然后执行

sudo service nginx restart

如果可行,默认情况下,托管服务提供商可能会在全新安装过程中在服务器上安装Apache,因此请继续阅读以获取更多永久性补丁。如果那没有用,请继续阅读以找出问题所在。

运行nginx -t,如果它不返回任何内容,我将验证Nginx错误日志。默认情况下,它应该位于中/var/log/nginx/error.log。

您可以使用任何文本编辑器打开它: sudo nano /var/log/nginx/error.log

你在那里可以找到可疑的东西吗?

您可以检查的第二个日志如下

sudo nano /var/log/syslog

当我遇到此问题时,这是因为托管服务提供商在全新安装过程中会自动安装Apache。它阻塞了端口80。

当我执行时,sudo nano /var/log/nginx/error.log我得到以下内容作为错误日志:

2018/08/04 06:17:33 [emerg] 634#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/08/04 06:17:33 [emerg] 634#0: bind() to [::]:80 failed (98: Address already in use)
2018/08/04 06:17:33 [emerg] 634#0: bind() to 0.0.0.0:80 failed (98: Address already in use)

上面的错误告诉我们,由于它已在使用中,因此无法将nginx绑定到端口80。

要解决此问题,您需要运行以下命令:

yum install net-tools

sudo netstat -tulpn

当您执行以上操作时,您将获得如下内容:

Proto Recv-Q Send-Q Local Address           Foreign Address         State    PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1762/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1224/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1528/sendmail:acce
tcp6       0      0 :::22                   :::*                    LISTEN      1224/sshd

您可以看到端口80被httpd(Apache)阻止了。如果您使用的是SSL,它也可能是端口443。

获取使用端口80或443的进程的PID。然后发送kill命令更改该<PID>值:

sudo kill -2 <PID>

请注意,在我的示例中,Apache的PID值为,1762因此我将执行sudo kill -2 1762

或者,您可以执行以下操作:

sudo fuser -k 80/tcp

sudo fuser -k 443/tcp

现在端口80或443已经清除,您可以通过运行以下命令启动Nginx:

sudo service nginx restart

还建议删除以前阻塞端口80和443的所有端口。这样可以避免将来发生任何冲突。由于Apache(httpd)阻止了我的端口,因此我通过运行以下命令将其删除:

yum remove httpd httpd-devel httpd-manual httpd-tools mod_auth_kerb mod_auth_mysql mod_auth_pgsql mod_authz_ldap mod_dav_svn mod_dnssd mod_nss mod_perl mod_revocator mod_ssl mod_wsgi

希望这可以帮助。


1
tnx我只是尝试“ sudo热熔器-k 80 / tcp”和“ sudo热熔器-k 443 / tcp”,nginx为我工作
— Mohmmad Ebrahimi Aval

就我而言,我是正式使用node / expressjs处理服务器。Http设置为在端口80上运行,而https设置为在端口443上运行。我视情况删除了它们,nginx可以按预期工作。我猜该错误意味着另一项服务正在使用端口
— 8080。– xplorer1

我遇到最奇怪的问题。当我sudo netstat -tulpn实际看到时tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 24873/nginx: master ,但是当我尝试启动该服务或查看其状态时,却发现此nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)异常。知道为什么吗?
— Newskooler19年

非常感谢您,节省了我的时间。
— Arun Kumar MG

51

通过运行以下命令可以方便地检查Nginx的配置文件的语法:

nginx -t -c /etc/nginx/nginx.conf

就我而言,它适用于sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf或仅适用于sudo /usr/local/nginx/sbin/nginx -t
— Pathros

上面的命令在添加到的配置文件中显示错误,nginx/sites-enabled这些错误解决后,所有其他命令将和平运行。
— Sachin Kumar

44

就我而言,这是因为apache服务器正在以某种方式运行。所以我停止了Apache,然后重新启动nginx。像魅力一样工作!

sudo /etc/init.d/apache2 stop
sudo systemctl restart nginx

16

尝试使用以下命令进行调试:

$ service nginx configtest

输出如下:

Testing nginx configuration: nginx: [emerg] unknown directive "stub_status" in /etc/nginx/sites-enabled/nginx_status:11
nginx: configuration file /etc/nginx/nginx.conf test failed

并修复这些警告

然后重启nginx


1
这将是最好的方法之一,需要尝试,谢谢
— GPrathap 16'Sep

29
测试Nginx配置:失败!
— IgorGanapolsky's

@IgorGanapolsky是的,转向俄罗斯工程
— itsnikolay

我得到The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
— 约瑟夫

15

问题的原因是这样的,我已经Apache安装了Web服务器,并且正在80本地计算机上积极侦听端口。

Apache并且Nginx是两个主要的开源高性能的网络能够处理不同工作负载以满足现代网络的需求需求的服务器。但是,Apache主要用作HTTP服务器,而Nginx高性能的异步Web服务器和反向代理服务器。

之所以无法Nginx启动,是因为Apache已经在侦听端口80作为其默认端口,该端口也是的默认端口Nginx。

一种快速的解决方法是Apache通过运行以下命令来停止服务器

systemctl stop apache2
systemctl status apache2

然后Nginx通过运行以下命令来启动服务器

systemctl stop nginx
systemctl status nginx

但是,当我们尝试Apache再次启动服务器时,由于它们都使用port80作为默认端口,因此同样的问题将再次出现。

这是我固定的方法:

运行以下命令以在Nano编辑器中打开Nginx的默认配置文件。

sudo nano /etc/nginx/sites-available/default

在Nano编辑器中打开文件时,向下滚动并将默认服务器端口更改为您选择的任何端口。对我来说,我选择将其更改为port85

# Default server configuration
#
server {
       listen 85 default_server;
       listen [::]:85 default_server;

另外,向下滚动并将虚拟主机端口更改为您选择的任何端口。对我来说,我也选择将其更改为port85

# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
# server {
#        listen 85;
#        listen [::]:85;

然后通过按键盘保存并退出文件:

Ctrl + S
Ctrl + X

仍然会提示您按键盘上的Y保存更改。

最后,确认您的配置正确并重新启动Nginx服务器:

sudo nginx -t
sudo systemctl restart nginx

您现在可以在浏览器上导航至localhost:nginx-port(localhost:85)以确认更改。

显示默认的Nginx起始页面

如果您希望在导航到localhost:nginx-port(时显示默认的Nginx起始页,localhost:85浏览器上),请执行以下步骤:

检查目录/var/www/html/,这是这root两个目录的默认目录,Apache并Nginx列出其内容:

cd ~
ls /var/www/html/

您将在目录中列出2个文件:

index.html                # Apache default start page
index.nginx-debian.html   # Nginx default start page

运行以下命令以在Nano编辑器中打开Nginx的默认配置文件:

cd ~
sudo nano /etc/nginx/sites-available/default

从此更改根目录中索引文件的顺序:

root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

为此(将默认的Nginx起始页-index.nginx-debian.html紧接放在第二个位置index):

root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.nginx-debian.html index.html index.htm;

然后通过按键盘保存并退出文件:

Ctrl + S
Ctrl + X

仍然会提示您按Y键盘上的保存更改。

最后,确认您的配置正确并重新启动Nginx服务器:

sudo nginx -t
sudo systemctl restart nginx

您现在可以在浏览器上导航至localhost:nginx-port(localhost:85)以确认更改。

就这样。

我希望这有帮助


1
我不知道,但是由于某种原因安装了apache。我没有安装。可能是我正在使用的VPS附带的,所以我忽略了此答案,而跟随所有其他答案,最后尝试了此步骤,非常感谢。现在,我可以睡觉了。
— Mujeeb Ishaque

1
非常感谢您提供的帮助
— Hanzla Habib

8

当某些内容无法绑定到端口时,该百分比为5%,因为它不是由root(粘性suid位,sudo)启动的,而为94%,因为另一个应用程序已绑定至该端口。

确保nginx确实已关闭,并且您不要试图意外地两次启动它。

确保没有运行使用端口80的Apache或其他服务。

利用netstat -a | grep tcp更多信息。


7

更改端口可能会有所帮助,因为80端口已在某处使用

vi /etc/nginx/sites-available/default

更改端口:

listen 8080 default_server;
listen [::]:8080 default_server;

然后重启nginx服务器

nginx -t
service nginx restart

5

就我而言,我需要跑步

sudo nginx -t

它将检查Nginx配置是否正确,如果不正确,它将显示导致错误的配置。

然后,您需要去/etc/nginx/sites-available修复损坏的配置。

之后,您可以毫无问题地重新启动Nginx。

sudo systemctl restart nginx

我有两个指向端口80的文件。删除其中一个即可。谢谢
— Vidhya

3

就我而言,nginx无法打开位于此处的日志文件 /var/log/nginx/error.log

这是因为我删除了日志目录以释放根目录下的空间(原来是愚蠢的)

然后,我在var中创建了一个日志文件夹,并在log中创建了一个nginx文件夹。

然后简单地运行 sudo service nginx start


3
$ ps ax | grep nginx<br>
$ kill -9 PIDs
$ service nginx start



或退后 /etc/nginx/sites-available/default

location / {
     #首先尝试将请求作为文件,然后
     #作为目录,然后回退到显示

     404。try_files $ uri $ uri / = 404;
}


2

尝试在nginx.conf中设置一个用户,也许这就是为什么他无法启动服务的原因:

User www-data;

我是否应该使用“ User = www-data”添加新行?
— daliborsb

在您的nginx.conf中。printscreen的第一行是用户nginx;删除#并放置用户www-data;
— user2925795 '16

将www-data更新为falcon170
— user2925795 '16

还是一样。我尝试查找“ journalctl -xe”,这就是我得到的。prntscr.com/acp9p5
— daliborsb

httpd和nginx在同一端口上运行。停止httpd,nginx可以启动。现在寻找解决方案。
— daliborsb

2

当我使用Vesta时,我遇到了同样的问题,后者与apache一起使用nginx。问题在于,应用所有更新后,Apache开始侦听443的https。解决的办法是注释掉ports.conf中的443个东西。这是因为nginx也使用此端口。



0

这为我工作:

首先,前往

cd / etc / nginx

并在nginx.conf中进行更改,并使默认端口从80侦听到您选择的85或其他任何内容。

然后使用此命令绑定该端口类型,以便nginx使用它:

管理端口-a -t PORT_TYPE -p tcp 85

其中PORT_TYPE是以下之一:http_cache_port_t,http_port_t,jboss_management_port_t,jboss_messaging_port_t,ntop_port_t,puppet_port_t。

然后运行:

sudo systemctl启动nginx; #sudo systemctl状态nginx

[您应该看到活动状态];#sudo systemctl启用Nginx


-1

我正在将RHEL 7.4与NGINX 1.13.8一起使用,如果我对sudo进行了同样的操作,则可以正常使用:

sudo systemctl status nginx.service

只要确保要使用的人都nginx.service具有执行权限即可。


-1

尝试:

sudo service nginx restart

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。-评论
— con

-1

只需写下您的工作就可以完成

sudo rm /etc/nginx/sites-enabled/default

sudo service nginx restart

systemctl status nginx

快乐学习


-2
  • 使用这些命令

    1. sudo服务apache2停止

    2. 须藤apt-get purge apache2

    3. sudo apt-get更新

    4. 须藤apt-get install nginx

    5. sudo服务nginx重启


10
更多的解释将使这成为一个更好的答案。
— CGritton '16
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.