Nginx监听端口配置

Nginx监听端口配置

引言

listen是server块的第一行指令,决定Nginx在哪个端口接收请求。一个server监听一个端口加域名组合,多站点靠server_name区分,多端口靠listen叠加。配错端口是最常见的502和无法访问根源。

基础HTTP监听

server {
    listen 80;
    server_name example.com;
    root /var/www/site;
    index index.html;
}

监听80端口,匹配example.com域名的请求进这个站点。

HTTPS监听

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
}

443必须加ssl关键字,同时配证书和私钥路径。

监听多个端口

server {
    listen 80;
    listen 8080;
    server_name example.com;
}

一个server块写多行listen,80和8080都走同一套配置。

只监听指定IP

listen 127.0.0.1:8080;

只绑回环地址,外部访问不到,适合内部管理接口。

80跳转到443

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

单独一个80 server做永久跳转,把HTTP请求引导到HTTPS。

默认服务器

server {
    listen 80 default_server;
}

default_server指定未匹配域名时的兜底站点,防直接用IP访问暴露默认页。

注意事项

  • 端口冲突先ss -tlnp查占用,别盲目改;
  • 443漏写ssl会导致证书不生效;
  • 云服务器还要在安全组放行对应端口;
  • listen不带IP默认绑0.0.0.0全部网卡;
  • 改端口后先nginx -t再reload;
  • 301跳转的旧URL参数用$request_uri保留。

总结

listen 80配HTTP,listen 443 ssl配HTTPS并带证书,多行listen监听多端口,IP:端口限定绑定网卡,80 server用return 301跳HTTPS,default_server做域名兜底。改前ss查占用、nginx -t校验、安全组放行,绑定IP时注意内外网可达性,跳转用$host和$request_uri保住完整地址。


emer 发布于  2026-10-20 07:10 

Docker端口映射,-p参数用法详解

前言

容器跑起来了,但外部访问不了,就是端口没映射好。本文讲Docker端口映射的各种用法。

一、什么是端口映射

Docker容器有自己的内部网络,外部要访问容器里的服务,得把宿主机的端口映射到容器的端口。

二、基本用法

格式

-p 宿主机端口:容器端口

例子

docker run -d -p 8080:80 nginx

意思:访问宿主机的8080端口,转发到容器的80端口。

浏览器访问

http://服务器IP:8080

三、各种写法

1. 指定宿主机端口和容器端口

-p 8080:80

2. 只指定容器端口,宿主机随机分配

docker run -d -P nginx

大写P,宿主机随机找个空闲端口。

3. 绑定指定IP

-p 127.0.0.1:8080:80

只允许本机访问,外网访问不了。

4. UDP端口

-p 53:53/udp

5. 映射多个端口

docker run -d \
  -p 80:80 \
  -p 443:443 \
  -p 2222:22 \
  nginx

四、查看端口映射

查看容器端口

docker port 容器名

输出:

80/tcp -> 0.0.0.0:8080

查看详细信息

docker ps

看PORTS列。

五、Docker Compose里的端口映射

services:
  nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
      - "127.0.0.1:8080:80"

六、常见场景

场景1:跑Nginx

docker run -d -p 80:80 --name mynginx nginx

场景2:跑MySQL

docker run -d -p 3306:3306 --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

场景3:跑Redis

docker run -d -p 6379:6379 --name redis redis

场景4:多个容器跑同一个端口

比如跑两个Nginx,分别用不同端口:

docker run -d -p 8081:80 --name nginx1 nginx
docker run -d -p 8082:80 --name nginx2 nginx

七、端口被占用怎么办

报错

Bind for 0.0.0.0:80 failed: port is already allocated

查谁占用了80端口

netstat -tlnp | grep :80
# 或者
lsof -i:80

解决

  1. 换个端口:-p 8080:80
  2. 或者把占用端口的程序关掉

八、端口映射的坑

坑1:只映射了容器端口,没映射宿主机端口

docker run -d -p 80 nginx

这样宿主机随机分配端口,不好记。

坑2:防火墙没开

端口映射了,但防火墙挡了,外网还是访问不了。

解决: 开放端口:

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

坑3:改不了端口映射

容器启动后,想改端口映射,改不了。

解决: 删掉容器重新跑。容器数据用卷挂载了就不怕丢。

坑4:绑定127.0.0.1后外网访问不了

-p 127.0.0.1:8080:80

这个只能本机访问,外网访问不了。

原因: 故意绑的本机。

解决: 改成 0.0.0.0:8080:80 或者直接 8080:80。

总结

记住:

  1. 基本格式:-p 宿主机端口:容器端口
  2. 多个端口就写多个 -p
  3. 端口被占用就换一个
  4. 防火墙也要开

常用:

docker run -d -p 80:80 --name nginx nginx

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:18 
'); })();