nginx域名转发的核心配置就是通过server块和server_name指令匹配域名,再配合proxy_pass把请求转发到目标服务。 如果你只想知道怎么最快搞定,记住这一句话就够了,下面我把从入门到排错的过程完整拆开,每一步都给你能直接跑通的写法。
nginx域名转发配置方法三步走
网上关于nginx域名转发的教程很多,但多数只给片段,没有讲清楚配置生效的逻辑,其实你只需要掌握三个步骤:找到配置文件、写好server块、重载nginx,整个流程熟练的话,两分钟内就能完成一次域名转发。
第一步:确定nginx配置文件位置
不同环境下的nginx配置路径略有差异,但大方向一致,你可以先用命令查一下实际路径:
nginx -t
这条命令会显示当前使用的配置文件完整路径,并提示语法是否正确,通常主流系统都放在 /etc/nginx/nginx.conf,而具体的站点配置会放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 目录下,为了不影响主配置文件,我建议你在conf.d目录下新建一个独立文件,domain-proxy.conf,这样域名转发配置可以单独维护,以后删除或修改都方便。
第二步:编写域名转发server块
打开你的配置文件,写入一个最基本的server块,假设你想把 blog.example.com 转发到本机的 3000 端口,配置如下:
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这段配置的核心有两个。server_name 用来匹配请求中的域名,只有访问 blog.example.com 才会走进这个server块。proxy_pass 则指定转发目标,可以把请求原封不动地交给后端的 0.0.1:3000 服务处理,行业共识认为,转发时带上 Host 和 X-Forwarded- 三个头是标准做法,否则后端程序拿不到用户的真实IP,也容易出现重定向跳错域名的现象。
第三步:重载nginx使配置生效
修改配置文件后需要让nginx重新加载配置,命令是:
nginx -t nginx -s reload
先测试语法,再平滑重载,整个过程中nginx不会中断服务,线上请求不会受到影响,到这里,一个最基本的nginx域名转发场景已经完成了。
nginx代理多个域名时如何区分路由

实际生产环境下,一台服务器上往往跑着多个服务,你需要用nginx代理多个域名,把它们分别转发到不同后端,这有两种常见做法:使用多个server块,或者用map指令做映射。
多个server块按域名分流
最直观的方式,就是为每个域名写一个独立的server块,
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
访问 api.example.com 会转发到8080端口,访问 admin.example.com 则转发到8081端口,两者互不干扰,需要注意的是,nginx会优先精确匹配server_name,如果有多个server块都能匹配,它会选择第一个,所以不要把有冲突的域名放在同一个端口下的前面位置。
用map指令按变量转发
如果后端地址经常变动,或者你想把所有域名都放在一个server块里统一处理,可以借助map指令,map做的事情是把域名映射成一个变量,然后再用proxy_pass引用这个变量。
map $host $backend {
default 127.0.0.1:9000;
api.example.com 127.0.0.1:8080;
admin.example.com 127.0.0.1:8081;
}
server {
listen 80;
server_name api.example.com admin.example.com;
location / {
proxy_pass http://$backend;
}
}
这种方式配置更集中,新增域名时只需要在map里加一行映射,不需要重复写整个server块,业内专家指出,map指令在域名转发场景中被大量使用,因为它把地址逻辑抽离出来,可读性和可维护性都比堆砌多个server块更好。
nginx域名转发到不同端口和路径
很多人在搜索引擎里问“nginx域名转发到不同端口怎么办”,其实端口和路径是两件事,需要分别处理,转发到不同端口直接改proxy_pass里的地址,转发到不同路径则需要用location匹配。
域名转发到不同端口
假设你的服务器上跑着一个Java应用在8080端口,一个Python应用在5000端口,你想让 blog.example.com 访问Java应用,让 tool.example.com 访问Python应用,配置方式就是按域名拆成两个server块,proxy_pass目标分别写成 http://127.0.0.1:8080 和 http://127.0.0.1:5000,这里有个容易踩坑的地方:如果后端服务监听在局域网或公网IP上,proxy_pass里不要写域名,直接写IP和端口,避免nginx再次触发DNS解析导致转发失败。
域名转发到不同路径
同一个域名下,你想根据路径转发到不同后端,典型的例子是

/api/ 走接口服务,/admin/ 走管理后台,配置写法如下:
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
location /admin/ {
proxy_pass http://127.0.0.1:8081;
}
}
注意proxy_pass的URI细节,如果proxy_pass后面没有路径,http://127.0.0.1:8080,nginx会保留完整的原始URI转发,如果proxy_pass后面带了一个路径,http://127.0.0.1:8080/,nginx会用这个路径替换掉匹配到的location前缀,你需要根据后端接口的实际接收路径来决定写不写末尾的斜杠。
nginx域名转发配置常见问题排查
配置写完了,但不一定一次就能跑通,下面几个问题是新手问得最多的,也是实际操作中最高频出现的故障点。
访问域名出现404或502
404通常说明nginx找不到匹配的server块,或者location路径不对,先检查 server_name 是否和访问域名完全一致,包括 www 前缀,502则说明nginx转发后,后端服务没有正常响应,确认后端端口是否在监听,可以用 curl -I http://127.0.0.1:3000 直接测试,如果本机访问正常,再检查防火墙和安全组是否放行了对应端口。
域名已经解析但访问跳转错误
这种情况多半是转发时没设置正确的Host头,后端程序会根据Host判断当前访问的是哪个站点,如果你转发时把Host丢了,后端拿到的可能是nginx服务器的IP或hostname,自然就跳到了默认站点,解决办法就是加上 proxy_set_header Host $host;,这一行在nginx域名转发配置方法中属于必须项,几乎每个正式场景都要带上。
HTTPS证书导致转发后不受信任
如果你的域名已经启用了HTTPS,那么转发配置也要相应调整,你需要监听443端口并配置SSL证书,然后再用proxy_pass转发到后端,后端如果也是HTTPS服务,可能需要关闭证书校验,但更安全的做法是让nginx和后端之间走内网HTTP,避免证书链复杂化。
nginx域名转发性能优化建议
域名转发配置完成后,适当做一些基础优化可以让nginx跑得更稳,这里只说几个改动成本低、见效快的点。
- 开启gzip压缩:在http块里配置
gzip on; gzip_types text/plain text/css application/json;,能显著减小传输体积。 - 调整keepalive连接:后端如果支持HTTP长连接,可以在upstream块里配置
keepalive 32;,减少频繁建立连接的开销。 - 设置合理的proxy_read_timeout:对于视频处理或大文件上传场景,默认60秒超时可能不够,根据业务需求调整到更合适的值。
- 启用日志切割:访问日志和错误日志别一直堆积,配合logrotate定期轮转,避免磁盘写满。

最近几年,越来越多的个人站长和中小企业使用nginx域名转发来统一入口,因为相比单独为每个服务买一台服务器,这种方式在成本上要低得多,一台2核4G的云服务器,配置好nginx域名转发,同时跑两三个小型Web服务完全够用,也符合多数初创项目初期的流量需求。
nginx域名转发常见问题解答
问:nginx域名转发和反向代理有什么区别?
这两个概念在nginx场景下基本可以等同,nginx域名转发是一种收到请求后按域名规则把流量导走的行为,而反向代理则是站在服务器侧替客户端和后端服务做中转,实际配置中,你用proxy_pass做的域名转发,本质上就是反向代理,如果你在做面试题或技术方案设计,不需要刻意区分它们,理解成同一件事即可。
问:nginx转发后为什么后端拿不到用户真实IP?
默认情况下,nginx转发请求时,后端看到的是nginx服务器的IP,而不是客户端的公网IP,要在后端获取真实IP,你需要手动设置请求头:proxy_set_header X-Real-IP $remote_addr; 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,设置完成后,后端从 X-Real-IP 取到的就是直连客户端的IP,对于PHP程序,你通常还需要把 $_SERVER['REMOTE_ADDR'] 的取值方式调整一下,具体要看框架。
问:多个域名转发到同一台服务器不同目录的路径怎么写?
这种情况需要把域名和目录同时匹配起来,nginx的location匹配无法直接读取server_name,你可以在每个server块里用 root 指定目录,但更常见的做法是让路径和域名在转发时一起处理。a.example.com 和 b.example.com 都指向同一台服务器,但分别对应 /var/www/a 和 /var/www/b,那么每个server块内加一句 root /var/www/a; 或 root /var/www/b;,再配合 location / 的处理逻辑即可,如果你的目标是一个通用配置,也可以用map把域名映射到目录路径,然后在location里用变量拼出实际路径,这样做的好处是新增域名时不用复制整个server块。
nginx域名转发的核心就一句话:写好 server_name 匹配域名,写好 proxy_pass 指向目标,剩下的都是在处理边界情况和优化细节,你只要照着上面的配置方法实际操作一遍,遇到问题按排查步骤逐个排除,很快就能把它跑顺。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/782775.html

