在Nginx中,listen指令用于指定服务器块(server)监听的IP地址和端口。它的语法灵活多样,可以适应不同的应用场景。以下是其核心语法规则和常见用法:
基本语法
listen address[:port] [default_server] [ssl] [http2] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
关键参数说明:
address[:port]
default_server
ssl
- 启用SSL/TLS,需配合
ssl_certificate和ssl_certificate_key指令。 示例:
listen 443 ssl;
http2
- 启用HTTP/2协议(需配合
ssl使用)。 示例:
listen 443 ssl http2;
proxy_protocol
常见组合示例
监听80端口(HTTP)
listen 80;
监听443端口(HTTPS)
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
同时监听IPv4和IPv6
listen 80;
listen [::]:80 ipv6only=off; # 关闭仅IPv6模式,同时监听IPv4和IPv6
默认服务器配置
listen 80 default_server;
server_name _; # 匹配所有域名
启用HTTP/2
listen 443 ssl http2;
特殊场景配置
重定向HTTP到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
# HTTPS配置...
}
使用不同端口区分域名
server {
listen 8080;
server_name example1.com;
}
server {
listen 8081;
server_name example2.com;
}
注意事项
- 端口冲突
同一个IP和端口只能被一个进程监听。若多个server块监听相同端口,需通过server_name区分请求。 TLS证书与SNI
- 若多个域名共用443端口,需使用支持多域名的证书(如SAN证书或通配符证书)。
- Nginx 1.15.0+ 支持
listen ... ssl sni语法,但需为每个域名单独配置监听。
权限限制
- 在Linux系统中,监听1024以下的端口需要root权限。
通过灵活配置listen指令,你可以实现单IP多域名、多端口监听、协议升级等复杂场景。建议结合实际需求,选择合适的参数组合。
更详细的说明:
完整语法结构
listen address[:port] [default_server] [ssl] [http2] [http3] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]] [accept_filter=filter] [ssl_preread=on|off] [transparent] [ipv6_v6only=on|off];
核心参数详解
1. 地址与端口(address[:port])
2. 默认服务器(default_server)
3. SSL/TLS支持(ssl)
4. HTTP/2支持(http2)
- 语法:
listen ... http2 - 作用:启用HTTP/2协议(需与
ssl同时使用)。 示例:
listen 443 ssl http2;
5. HTTP/3支持(http3)
- 语法:
listen ... http3 - 作用:启用HTTP/3协议(需与
ssl同时使用,且需Nginx 1.21.3+)。 示例:
listen 443 ssl http3;
6. PROXY协议(proxy_protocol)
7. TCP快速打开(fastopen)
8. TCP接收/发送缓冲区(rcvbuf/sndbuf)
9. IPv6兼容性(ipv6only)
10. 端口复用(reuseport)
11. TCP保活机制(so_keepalive)
12. 透明代理(transparent)
13. SSL预读取(ssl_preread)
常见组合示例
1. 基础HTTP服务器
listen 80;
server_name example.com;
2. HTTPS + HTTP/2服务器
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
3. IPv4/IPv6双栈监听
listen 80;
listen [::]:80 ipv6only=off;
4. 默认服务器 + PROXY协议
listen 80 default_server proxy_protocol;
server_name _;
5. 高性能配置(多进程复用端口)
worker_processes auto;
listen 80 reuseport backlog=8192;
注意事项
- 权限限制:监听1024以下的端口需要root权限。
- 端口冲突:同一IP和端口只能被一个进程监听,多个
server块监听相同端口时需通过server_name区分请求。 - TLS证书与SNI:若多个域名共用443端口,需使用支持多域名的证书(如SAN证书或通配符证书)。
- 系统调优:高并发场景下,需配合调整系统参数(如
net.core.somaxconn)以充分发挥listen参数的效果。
通过灵活组合listen指令的参数,你可以实现各种复杂的网络配置,包括负载均衡、协议升级、性能优化等。建议根据实际需求和服务器性能选择合适的参数组合。