随机
Enter 搜索 ↑↓ 切换 Esc 清空

nginx-port-fix

命令

Nginx 端口占用问题解决

nginx-port-fix

Nginx 端口占用问题解决

补充说明

80 端口是 HTTP 服务的标准端口,当多个 Web 服务器(如 Nginx、Apache)同时运行时,会产生端口冲突,导致服务无法正常启动。

问题诊断:找出端口占用元凶

使用 ss 命令检测端口占用:

sudo ss -tulnp | grep :80

命令解析:

参数 说明
-t 显示 TCP 连接
-u 显示 UDP 连接
-l 仅显示监听状态的连接
-n 以数字形式显示端口
-p 显示进程信息

输出示例:

tcp   LISTEN 0      511                 *:80               *:*    users:(("apache2",pid=788,fd=4),("apache2",pid=787,fd=4),("apache2",pid=784,fd=4))

解读关键信息:

解决方案一:修改 Nginx 监听端口

方法特点:非侵入式、无需停止其他服务、可自定义任意可用端口。

步骤 1:定位 Nginx 配置文件

# 查看 Nginx 主配置包含的目录
grep -E 'include.*conf' /etc/nginx/nginx.conf

# 快速搜索所有监听 80 端口的配置
grep -R 'listen.*80' /etc/nginx/

搜索结果示例:

/etc/nginx/conf.d/default.conf:    listen       80;
/etc/nginx/conf.d/default.conf:    # proxy the PHP scripts to Apache listening on 127.0.0.1:80

步骤 2:修改监听端口

sudo nano /etc/nginx/conf.d/default.conf

修改内容:

# 找到这一行:
listen       80;

# 修改为(例如 8080 端口):
listen       8080;

步骤 3:重启 Nginx 服务

sudo systemctl restart nginx
sudo systemctl status nginx

解决方案二:卸载冲突服务 Apache2

适用场景:不再需要 Apache2 服务、希望彻底释放 80 端口、确定 Nginx 将作为主要 Web 服务器。

完整卸载流程

# 停止 Apache2 服务
sudo systemctl stop apache2

# 彻底卸载 Apache2 及相关包
sudo apt purge -y apache2* libapache2*

# 清理残留依赖包
sudo apt autoremove -y

# 清理配置文件缓存
sudo apt autoclean

命令说明:

命令 说明
purge 彻底删除软件包及配置文件
autoremove 自动移除不再需要的依赖包
autoclean 清理已下载的旧版本软件包

验证与确认

验证端口占用情况

# 检查 80 端口是否已释放
sudo ss -tulnp | grep :80

# 检查 Nginx 是否在新端口运行
sudo ss -tulnp | grep nginx

测试 Nginx 服务状态

# 检查服务状态
sudo systemctl status nginx

# 测试配置语法
sudo nginx -t

# 重新加载配置(如果只是修改配置)
sudo systemctl reload nginx

浏览器访问测试

访问 http://你的服务器IP:8080 确认 Nginx 正常运行。

进阶技巧与预防措施

端口冲突预防方案

服务自动检测脚本:

#!/bin/bash
PORT=80
if sudo ss -tuln | grep ":${PORT} " > /dev/null; then
    echo "端口 ${PORT} 已被占用,正在检查进程..."
    sudo ss -tulnp | grep ":${PORT}"
else
    echo "端口 ${PORT} 可用"
fi

多端口监听配置:

server {
    listen 80;
    listen 8080;
    server_name example.com;
    # 其他配置...
}

性能优化建议

Nginx 工作进程优化(在 /etc/nginx/nginx.conf 中调整):

worker_processes auto;        # 自动根据 CPU 核心数设置
worker_connections 1024;      # 每个工作进程连接数

查看系统可用端口范围:

sysctl net.ipv4.ip_local_port_range

监控与日志分析

# 实时监控 Nginx 连接
sudo watch -n 1 'ss -tulnp | grep nginx'

# 查看 Nginx 访问日志
sudo tail -f /var/log/nginx/access.log

总结与最佳实践

问题解决路径

  1. 诊断阶段:使用 ss 命令准确识别端口占用情况
  2. 方案选择:根据需求选择修改端口或卸载冲突服务
  3. 验证确认:多维度验证问题是否彻底解决

生产环境部署建议

安全加固

sudo ufw allow 80/tcp comment 'HTTP Service'
sudo ufw allow 8080/tcp comment 'Alternative HTTP Port'

自动化运维脚本

#!/bin/bash
# 自动检测并解决端口冲突
check_and_fix_port_conflict() {
    local port=$1
    local service=$2

    if sudo ss -tuln | grep ":${port} " > /dev/null; then
        echo "检测到端口 ${port} 冲突,正在重启 ${service}..."
        sudo systemctl restart $service
    fi
}

核心要点回顾