117

nginx.service 失败,因为控制进程退出

$ 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.
4

23 回答 23

196

尝试运行以下两个命令:

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

于 2018-08-04T10:54:19.093 回答
74

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

sudo /etc/init.d/apache2 stop
sudo systemctl restart nginx
于 2019-03-14T13:59:18.167 回答
62

通过运行以下命令检查 Nginx 配置文件的语法可能会派上用场:

nginx -t -c /etc/nginx/nginx.conf
于 2016-10-16T22:48:54.213 回答
23

问题的原因是,我已经安装了Web 服务器并在本地机器上Apache主动监听端口。80

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

无法Nginx启动是因为Apache已经在监听端口 80 作为其默认端口,这也是Nginx.

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

systemctl stop apache2
systemctl status apache2

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

systemctl stop nginx
systemctl status nginx

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

这是我修复它的方法

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

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

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

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

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

# 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( localhost:85) 时显示默认 Nginx 起始页面,请执行以下步骤:

检查作为两者/var/www/html/的默认root目录的目录ApacheNginx列出其内容:

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) 以确认更改。

于 2019-10-10T23:22:43.410 回答
18

尝试使用命令调试:

$ 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

于 2016-08-13T14:19:13.847 回答
10

当某些东西无法绑定到端口时,它是 5%,因为它不是由 root 启动(粘性 suid 位,sudo)和 94%,因为另一个应用程序已经绑定到该端口。

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

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

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

于 2016-12-16T14:08:51.357 回答
8

2022 年 1 月更新:

最简单的方法是杀死所有 nginx 进程

sudo killall nginx

然后:

sudo nginx

或者:

sudo service nginx start
于 2021-02-09T21:55:49.823 回答
8

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

vi /etc/nginx/sites-available/default

更改端口:

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

然后重启nginx服务器

nginx -t
service nginx restart
于 2018-10-19T14:31:59.050 回答
6

就我而言,我需要运行

sudo nginx -t

它会检查 Nginx 配置是否正确,如果不正确,它会告诉你是哪个配置导致了错误。

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

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

sudo systemctl restart nginx
于 2019-08-18T09:24:02.167 回答
6
$ ps ax | grep nginx<br>
$ kill -9 PIDs
$ service nginx start



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

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

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

于 2018-03-25T17:31:52.793 回答
4

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

User www-data;
于 2016-03-08T14:06:42.273 回答
4

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

这是因为我删除了日志目录以释放 root 中的空间(结果很愚蠢)

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

然后简单地运行sudo service nginx start

于 2019-05-07T10:10:22.793 回答
3

其他一些进程已经在运行并绑定到端口 80/443,因此 systemd 无法启动 nginx。这几乎总是因为该进程是手动启动的,而不是通过 systemd 启动的,或者因为您试图同时启动两个不同的 Web 服务器。

要解决此问题,请在通过 systemd 重新启动之前自行终止该进程。

对我来说,apache web 服务器已经在运行,所以杀死它就可以了!

sudo killall apache2
于 2021-03-14T11:16:38.510 回答
3

我在使用 Vesta 时遇到了同样的问题,它使用 nginx 和 apache。问题是,在应用所有更新后,Apache 开始为 https 监听 443。解决方案就是注释掉ports.conf 中的443 内容。这是因为 nginx 也使用了这个端口。

于 2017-11-03T15:53:04.930 回答
3
  • 使用这些命令

    1. sudo 服务 apache2 停止

    2. sudo apt-get purge apache2

    3. sudo apt-get 更新

    4. sudo apt-get 安装 nginx

    5. sudo 服务 nginx 重启

于 2016-12-16T12:58:34.703 回答
2

如果你在centOS系统下检查df -h

于 2019-04-01T13:07:28.257 回答
1

就我而言,这是由于我的/etc/nginx/nginx.conf文件中的语法无效。

确切的错误消息如下。
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

因此,我运行了以下命令以获取详细信息。
> systemctl status nginx.service
invalid URL prefix in /etc/nginx/nginx.conf:48
这表示 nginx.conf 的语法无效。

我指的是这个修复它。

于 2021-10-01T14:59:38.037 回答
1

这对我有用:

首先,前往

cd /etc/nginx

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

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

semanage port -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 status nginx

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

于 2020-02-21T07:32:03.993 回答
1

这对我有用

sudo fuser -k 80/tcp

sudo fuser -k 443/tcp

然后

sudo  -H apt-get  purge  nginx-common  nginx-full

sudo  -H apt-get  install  nginx-common  nginx-full


sudo systemctl restart nginx
于 2021-06-12T10:44:33.017 回答
1

在使用错误语法在 vvv-config.yml 中为 VVV 配置新站点时遇到此问题,vagrant up将引发错误。删除并恢复到旧配置,运行有vagrant provision帮助

于 2021-01-28T09:38:31.103 回答
0

重新安装 nginx 对我有用

卸载 nginx:

sudo apt-get remove nginx nginx-common
sudo apt-get autoremove

安装 nginx:

sudo apt update
sudo apt install nginx
于 2022-01-04T02:34:53.413 回答
-1

就我而言,我错过了默认文件中的分号,这就是出现此错误的原因。

于 2021-09-19T05:28:27.350 回答
-1

我将 RHEL 7.4 与 NGINX 1.13.8 一起使用,如果我对 sudo 执行相同操作,它可以正常工作:

sudo systemctl status nginx.service

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

于 2018-02-05T04:10:56.157 回答