在Nginx中,基于域名和端口的虚拟主机配置是其核心功能之一,通过server块内的listen指令和server_name指令共同实现。每个server块可以绑定到特定的IP地址:端口组合,并通过server_name匹配请求的Host头部,从而将不同域名或端口的流量路由到不同的后端服务或静态文件目录。

listen指令用于指定Nginx监听的IP地址和端口,语法为 listen [address:]port [options];。例如 listen 80; 监听所有IPv4地址的80端口,listen 443 ssl; 监听443端口并启用SSL。可以同时监听多个端口,如 listen 80; 和 listen 8080;,实现不同端口对应不同服务。
server_name指令用于匹配请求的域名,支持精确匹配、通配符匹配(如 *.example.com)和正则表达式匹配(如 ~^(www\.)?example\.com$)。当多个server块监听同一端口时,Nginx会按照以下顺序选择匹配的server:首先精确匹配server_name,其次通配符(以星号开头的最长匹配),再次正则表达式(按配置顺序),最后如果都未匹配,则使用listen指令中default_server标记的server块(若未显式指定,则使用该端口的第一个server块)。
典型的基于域名端口配置示例如下:
server {
listen 80;
server_name www.example.com;
root /var/www/example;
}
server {
listen 80;
server_name api.example.com;
root /var/www/api;
}
server {
listen 8080;
server_name www.example.com;
root /var/www/example_port8080;
}
上例中,访问http://www.example.com:80会被第一个server处理,访问http://api.example.com:80被第二个server处理,而访问http://www.example.com:8080则被第三个server处理。注意,端口和域名共同决定了唯一匹配的server块。
当多个server块监听相同端口且server_name无法匹配时,Nginx会使用默认server。可以通过在listen指令后添加 default_server 参数显式指定,例如 listen 80 default_server;。该默认server通常用于处理未匹配的域名请求,返回404或重定向。
此外,基于端口的虚拟主机可以与SSL/TLS结合,例如监听443端口并附加 ssl 参数,配合server_name实现HTTPS的多域名支持。注意,在HTTPS中,由于SNI(Server Name Indication)扩展,Nginx可以在同一IP地址和端口下根据域名提供不同的SSL证书,极大增强了灵活性。
总结:Nginx基于域名端口的配置通过listen和server_name的组合,实现了多站点、多服务的灵活路由,是构建反向代理、负载均衡和微服务架构的基础。在实际生产环境中,需注意监听端口冲突、域名解析以及防火墙规则等问题,确保配置正确生效。

查看详情

查看详情