Nginx未监听80端口

79

我刚刚安装了Ubuntu 12.04服务器和nginx 1.2.7,从sites-enabled中删除了default,并将自己的文件添加到中,并在中创建了符号链接。然后重新启动了nginx。

问题:然而打开URL无法加载网站。netstat -nlp | grep nginxnetstat -nlp | grep 80都没有结果!lsof -i :80也没有返回任何东西。从另一台服务器上进行的dig查询返回了正确的IP地址,因此不应该是DNS问题。我能够连接到Apache,但现在已停止其服务。nginx日志也没有显示任何内容。

我应该如何解决这个问题?

/etc/nginx/site-available/mysite.com

server {
    listen   80;
    server_name www.mysite.com mysite.com *.mysite.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    root /var/www/mysite/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }

}

日志里有什么吗? - mata
它真的在运行吗?你是用sudo启动它了吗? - Dondi Michael Stroma
13
不要因为你不知道答案就对一个问题进行负评。我遇到了同样的问题。访问日志中没有任何内容...它正在监听*:80端口。调试错误日志中没有错误。是的,@DondiMichaelStroma,它正在运行。(哈哈)。 - Swivel
1
你找出问题所在了吗?我也遇到了类似的问题... - Alexandre Mélard
也帮助了我。由于@Nyxynyx的帮助,我在链接和服务器块方面变得不那么马虎了。 - hulkinggrunt
显示剩余2条评论
11个回答

140

我有过同样的问题,解决方法是我没有正确地建立站点配置文件的符号链接。尝试运行 vim /etc/nginx/sites-enabled/mysite.com,你能进入吗?我当时遇到了“Permission Denied”错误。

如果不能,请运行以下命令:

rm /etc/nginx/sites-enabled/mysite.com
ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com

49
这对我有用!显然,如果在第二个参数中没有键入完整的文件名,即 ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/,它会创建一种虚假的符号链接,这会导致 nginx 出现问题。奇怪但是事实如此。 - Steve Davis
2
这对我也是一个解决方案。我已经困扰了几个小时,试图修复nginx的安装问题。太棒了,各位先生! - Aaron Ransley
谢谢!你拥有100万个甜甜圈! - pkarc
这真是极其恼人!谢谢你! - Van Dame
是的,同样的问题和解决方案!在更改后记得重新加载nginx配置。sudo service nginx reload - Juha Untinen
显示剩余9条评论

35

如果您的日志没有记录此问题,则可能未包含sites-enabled目录。确认网站已加载的一种简单方法是在服务器块中设置错误/访问日志路径为唯一路径,重新加载nginx,并检查是否创建了文件。

请确保以下include指令存在于/etc/nginx/nginx.conf中的http上下文中。

http {
  ...
  include /etc/nginx/sites-enabled/*;
}

3
漏掉了一个这么简单的事情,谢谢你提醒! - Hayden
1
非常感谢!你救了我的一天。 - brunocascio
在某些版本的nginx中,您需要编写include /etc/nginx/sites-enabled/*.*; - sunwarr10r

12
我发现以下步骤有助于调试nginx: 1... 确保nginx正在运行。
ps aux | grep nginx

2... 检查是否有已绑定到相关端口的进程。

lsof -n -i:80

3...确保已经重新加载了nginx。

sudo nginx -t
sudo nginx -s reload

在Mac上,brew services restart nginx不能充分重新加载nginx。
尝试手动创建简单的响应,以确保位置路径没有混乱。当使用proxy_pass将请求转发到其他运行中的应用程序时出现问题时,这尤其有帮助。
location / {
    add_header Content-Type text/html;
    return 200 'Here I am!';
}

我尝试使用 lsof -nP 命令来检查 nginx 是否在监听。但是,只有 netstat -van 命令中才能看到 nginx,而在 lsof 中却没有。也许这是因为 nginx 不像文件那样打开套接字,而是使用特殊的异步 I/O 调用? - Curtis Yallop
当我加上“sudo…”前缀时,“brew services * nginx”可用。 另请参阅https://dev59.com/HloT5IYBdhLWcg3w6iwA。 - Curtis Yallop

7
我遇到了相同的问题,使用HTTP连接时收到了“无法加载资源:net :: ERR_CONNECTION_REFUSED”错误,但在HTTPS上运行良好。使用 netstat -tulpn 命令发现nginx未为IPv4绑定到端口80。已经执行了这里描述的所有操作。结果是一些非常愚蠢的事情:确保启用具有 default_server sites-available文件。希望这可以为其他一些可怜的笨蛋节省时间。

5
您可能将nginx绑定到端口80两次了。这是您完整的配置文件吗?您没有其他语句监听端口80吗?

我试图将GitLab托管在80端口,但发现那个端口也绑定了一个“默认”站点。删除后者后,我的GitLab主机运行良好。 - riezebosch
1
@riezebosch 移除该站点的配置应该可以解决问题,但如果您想多次监听端口80,则可以使用不同的 server_names。 - Andres
@Andres - 给你的评论点赞,谢谢,这很有帮助。 - Rohit Dhankar
nginx 在 /etc/nginx/sites-enabled 中有一个默认站点,我将其删除了,现在它可以工作了! - Sahin

3

例如,在/etc/nginx/nginx.conf中,包含include /etc/nginx/servers-enabled/*;的那一行前面缺少了一个分号;,这可能会使该指令被忽略,然而运行nginx -t命令时不会报错。

因此,请确保/etc/nginx/nginx.conf中的所有指令都以分号;结尾。


3

我曾经在服务器上遇到同样的问题,这里我列出了我是如何解决它的:

第一步:安装 Ngnix

sudo apt update
sudo apt install nginx

第二步 - 调整防火墙

sudo ufw app list

您应该获取应用程序配置文件列表:

输出结果 可用的应用程序: Nginx完整版 Nginx HTTP Nginx HTTPS OpenSSH

正如您所见,Nginx提供了三个应用程序配置文件:

Nginx完整版:此配置文件同时打开端口80(普通的未加密的Web流量)和端口443(TLS/SSL加密流量)。

Nginx HTTP:此配置文件仅打开端口80(普通的未加密的Web流量)。

Nginx HTTPS:此配置文件仅打开端口443(TLS/SSL加密流量)。

由于在本指南中尚未为我们的服务器配置SSL,因此我们只需要允许端口80上的流量。您可以通过输入以下命令来启用它:

sudo ufw allow 'Nginx HTTP'

您可以通过输入以下命令来验证更改:

sudo ufw status

第三步 - 检查您的Web服务器

systemctl status nginx

现在检查端口80,对我有用,希望对您也有用。


我遇到了这个问题,你能帮我解释一下吗?链接为:https://dev59.com/K30QtIcB2Jgan1znid7o - UMR

1

您是否检查过您的nginx二进制文件是否真实存在?请检查一下。

#whereis nginx

输出二进制路径并检查此路径是否与您的init脚本匹配,路径位于/etc/init.d/nginx。例如:

DAEMON=/usr/sbin/nginx

在我的初始化脚本中,会调用"test -x $DAEMON || exit 0",但无论如何,该脚本都没有返回任何内容——我的二进制文件完全丢失了。

1
我们都认为自己不会犯傻瓜错误,但其实我们会。因此,如果你正在调查NGINX问题,所有迹象都表明它应该工作,那么你应该离开文件,向下查看。系统防火墙、硬件防火墙、NAT路由器/防火墙。对我来说,这个问题是我的路由器,我运行一个家庭实验室,所以我可以从远处访问我的路由器后面的服务,我使用NGINX作为反向代理,因为我的路由器只处理基于IP的传入请求,并不处理主机名,我相信这是相当正常的。无论如何,我的问题是在几天前我在保护我的网络时出现的,删除了一些不再需要的端口转发,不小心删除了端口80。是的,只需将该端口重新转发到NGINX,所有问题就解决了。我现在非常羞愧地走开了,但我留下这个答案,以表达我对帮助我找到自己错误的人们的感激之情。所以谢谢你们。

0
在我的情况下,这些网络命令的输出显示nginx正确地绑定到端口80,但是这些端口在外部不可访问或使用nmap不可见。
虽然我怀疑是防火墙的问题,但事实证明机器上旧的iptables规则正在重定向那些端口的流量并与nginx发生冲突。使用sudo iptables-save查看所有当前适用的规则。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接