资讯动态

Nginx反向代理:从IP+端口到域名访问的完整配置指南

发布时间:2026/10/14 10:23:35 来源:尧图企业网站定制
我见过不少团队后台管理系统部署完直接甩给业务方一个http://192.168.x.x:8080。能用但每次看到对方把IP和端口存在记事本里我都觉得这事没做完。上了域名访问配上Nginx反向代理才是这套系统真正能拿去交付的状态。这篇内容不绕弯子直接讲清楚从IP加端口到域名访问的全过程覆盖原理、配置、HTTPS和常见坑适合刚接触Nginx的运维新手也适合要自己搞定部署的全栈开发。1. 为什么要给后台系统配上域名访问1.1 IP访问的痛点先说说直接用IP访问的问题。第一记不住。192.168.1.10:8080这种地址脱离了收藏夹和聊天记录基本没人能靠脑子记住。第二端口混乱。一个服务器上可能同时跑着管理系统、API服务、监控面板每个都占一个端口端口一多就乱套。第三不安全。浏览器对IP访问的HTTP页面会有明显的“不安全”提示对用户信任度影响很大。第四后面要做HTTPS、做域名级限流、做统一的访问入口IP方式都绕不过去。有人可能说内网系统无所谓能访问就行。但实际运营中你会发现只要系统被业务同事频繁使用就会有人不停来问“地址是多少来着我这边打不开了。”域名访问把这一系列问题都收口了好记、好用、好管理。1.2 域名加反向代理的价值域名的意义不只是换一个访问入口。它背后牵涉到你整个访问架构的调整。在你没有域名的时候客户端请求是直接打到后端程序上的浏览器 - Tomcat/Jetty/Nginx自身进程。有了域名和Nginx反向代理请求变成了这样浏览器 - 域名解析到服务器IP - Nginx监听80/443端口 - Nginx根据域名和路径规则转发到对应的后端服务。后端服务从此不需要关心外部访问者怎么找到它也不需要再暴露额外的端口。所有外部访问都从Nginx这一个口进出。拿生活里的场景类比Nginx就像单位的传达室来访者只需要说“我找张经理”传达室的人就知道张经理在哪个工位再把他带过去。你不必知道张经理工位的详细路线图也不用直接去工位打扰他。这个模式的好处是后端服务可以安心待在内网或本机只对Nginx开放将来要换后端服务只要改动Nginx配置外部使用者完全无感。2. Nginx反向代理的核心思路与前置准备2.1 反向代理不是什么神秘技术Nginx的反向代理简单说就是把客户端的请求接过来再替客户端去请求后端服务最后把后端返回的结果原样交回给客户端。对整个流程来说Nginx就是中间人。原理层面你需要知道几个核心要素Nginx监听哪个端口、Nginx按什么规则匹配进来的请求域名和路径、Nginx替客户端去请求哪个后端地址。这三件事分别对应配置里的listen、server_namelocation、proxy_pass。再稍微细挖一层Nginx收到请求后会先在多个server块中做选择选择的依据就是server_name和listen的端口。找到合适的server块后再根据请求的URI去匹配location规则。命中规则后Nginx按照proxy_pass配置的地址将请求转发给后端。这里有个关键点Nginx在转发时默认会带上自己认为合适的请求头。而真正能被后端程序识别的客户端信息比如真实IP、原始域名往往需要你手动通过proxy_set_header传过去。这一块是很多人配置之后功能不正常的重灾区。2.2 关键配置要素逐个拆先说listen。没有特殊需要就写listen 80这是HTTP的标准端口。如果你要上HTTPS则写listen 443 ssl。也有人为了调试写8080或者别的端口但在生产环境我不建议这么做因为会让用户重新陷入“端口记忆”的麻烦。再说server_name。这一项用来区分不同域名访问同一台服务器时应该走哪套配置。比如服务器上有admin.example.com和api.example.com两个域名Nginx就靠这个字段判断请求该交给哪一端的后端。如果没有匹配到任何server_nameNginx会走默认的server块通常就是配置文件里的第一个server所以要注意默认配置的兜底行为。proxy_pass是转发地址。这是最容易出细节问题的一行配置。很多人不理解http://127.0.0.1:8080和http://127.0.0.1:8080/有什么区别。区别在于前者不带斜杠转发时会把完整的原始URI拼在地址后面后者带了斜杠Nginx会把原始URI中匹配location的部分替换掉。这个差异在具体项目中会导致完全不同的结果后面我会专门讲。2.3 动手前先确认三件事开始配置之前别急着一上来就改Nginx。先把下面几件事确认好第一服务器上确认Nginx已经安装并且正在运行。执行nginx -v看版本号执行ss -lntp | grep nginx看监听状态。如果还没安装用软件包管理器装一下即可这里不展开。第二确认后端管理系统本身是正常的。先在本机直接访问后端服务地址比如curl http://127.0.0.1:8080能返回页面或接口数据再往下走。后端如果本来就是挂的后面排查起来就要两头找问题。第三准备一个域名并让这个域名解析到当前服务器的IP。如果只是本地测试可以用系统hosts文件做一个临时的域名映射步骤会在后面讲到。公网环境则需要在DNS服务商那里添加一条A记录把域名指向你的服务器公网IP。3. 从零落地HTTP版域名访问配置3.1 最简可用配置我先给你看一个最基础的配置。假设后台管理系统的后端服务跑在本机的127.0.0.1:8080域名是admin.example.com。完整的server块配置如下server { listen 80; server_name admin.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }这段配置直接放进/etc/nginx/conf.d/下的一个新建配置文件里即可比如/etc/nginx/conf.d/admin.conf或者放进主配置里也行看你的Nginx目录结构习惯。逐行解释一下这几个proxy_set_header为什么不能省。Host $host最为关键。后端的很多程序会校验访问者的Host头尤其是Spring Boot这类框架如果发现Host不对可能会拒绝服务或生成错误的跳转链接。同时一些通过域名区分租户或功能的系统也依赖Host头来判断当前访问的是哪个站点。X-Real-IP $remote_addr用来传递客户端的真实IP。后端程序如果没有这个头会以为所有请求都来自Nginx所在的IP也就是127.0.0.1这样你的日志审计、访问统计、黑白名单就全部失去意义。X-Forwarded-For $proxy_add_x_forwarded_for是在X-Real-IP基础上追加一层代理链路信息。多级代理时每一级都会往这个头里追加IP后端拿着它能看到整条请求链路。X-Forwarded-Proto $scheme告诉后端客户端原始请求是HTTP还是HTTPS。这个头很重要因为Nginx自身和客户端通常用HTTP通信而后端程序如果想生成一个HTTPS的绝对链接比如用户回调地址就必须知道客户端的原始协议。不传这个头后端可能把https://生成成http://导致跳转链接被浏览器拦截。3.2 验证配置正确性改完之后不要直接重启先做配置检查nginx -t正常情况下会输出类似syntax is ok和test is successful的结果。有问题的话它会告诉你在哪个文件第几行报错照着改就行。然后重载配置systemctl reload nginx重载和重启的区别在于重载会平滑地重新读取配置不需要中断正在处理的请求重启则会短暂中断服务。日常改配置用reload就够了只有改动了监听端口、调整了核心模块这类场景才需要重启。接着验证转发是否生效。在服务器上执行curl -H Host: admin.example.com http://127.0.0.1/这里curl直接请求本机的80端口但是用-H参数伪造了一个Host头。如果配置正确你会看到后端管理系统返回的HTML内容。这一步可以帮你快速确认Nginx和后端的链路是否通畅而不需要真正在浏览器里输入域名。最后打开浏览器访问http://admin.example.com看到的应该是后台管理系统的登录页。按F12进入开发者工具切到网络面板点击刷新查看第一个请求的响应头里面应该能看到Server: nginx之类的字样。3.3 没域名时用hosts本地测试如果你的域名还在申请中或者只是想在本地环境演练一遍可以用修改hosts文件的方式模拟域名解析。Windows系统的hosts文件在C:\Windows\System32\drivers\etc\hostsmacOS和Linux在/etc/hosts。打开后追加一行192.168.1.10 admin.example.com其中192.168.1.10替换成你服务器的实际IP。保存之后本机浏览器访问http://admin.example.com就会解析到你的服务器。这里有个容易被忽略的点hosts文件修改后浏览器不一定立刻生效部分浏览器会有DNS缓存。试试强制刷新或者无痕窗口打开。Windows下有时候需要管理员权限才能编辑这个文件别忽略了。注意hosts只对当前这台机器生效其他同事访问还是要靠真实DNS解析。所以这个办法只适合本地调试不适合当最终交付方案。4. 生产级加固HTTPS与协议细节4.1 上HTTPS的必要性后台管理系统承载的都是有权限要求的业务操作如果它的登录页还在走明文HTTP那账号密码相当于裸奔在网络上。尤其当你需要通过公网访问管理系统时HTTPS不是可选项而是必选项。浏览器面对没有证书的页面会弹警告很多用户看到“不安全”提示就直接关掉了这也会直接影响系统的使用率。免费证书目前最常用的来源是Lets Encrypt配合自动化工具可以做到自动续期。以官方客户端举例安装后执行一条命令即可申请certbot --nginx -d admin.example.com这个命令会自动修改Nginx配置并加载证书。如果没有外网环境或者不想依赖外部CA也可以自建CA或者用自签名证书。自签名证书的生成命令也很简单openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/admin.example.com.key \ -out /etc/nginx/ssl/admin.example.com.crt不过自签名证书有个毛病浏览器会不信任它因为签发者不是公认的证书机构。内网做测试可以如果系统要给业务方长期使用还是建议申请受信任的证书。企业内网也可以搭一套私有CA然后把根证书导入公司所有电脑的受信任根证书存储区这样内网域名也能实现HTTPS且浏览器不告警。4.2 完整HTTPS配置示例证书就绪后把刚才的HTTP配置改成HTTPS版本server { listen 80; server_name admin.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name admin.example.com; ssl_certificate /etc/nginx/ssl/admin.example.com.crt; ssl_certificate_key /etc/nginx/ssl/admin.example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }第一个server块的作用是把所有HTTP请求永久重定向到HTTPS。301是永久重定向浏览器会记住这个跳转之后访问HTTP地址时直接在本地就跳到HTTPS了。如果只是临时测试可以用302这样每次都会重新询问服务器。生产环境用301没毛病。第二个server块监听了443端口并指定了证书路径。ssl_protocols和ssl_ciphers属于基础的加密套件配置TLSv1.2和TLSv1.3是当前主流选择。再往下的location和之前的HTTP配置完全一致因为后端代理逻辑并没有变。改完同样执行nginx -t检查通过后systemctl reload nginx。浏览器访问https://admin.example.com如果证书没问题地址栏会有一个小锁图标这就对了。4.3 一个很多人忽略的坑X-Forwarded-Proto我特意把X-Forwarded-Proto单独拿出来说因为后端程序经常用到它。举个例子管理系统里有一个“导出报表”功能后端生成下载链接时用协议、域名、路径拼接绝对地址。如果后端拿到的是http那么生成的下载链接也是http://。当用户已经在HTTPS页面时浏览器会拦截混合内容请求或者直接提示不安全。所以proxy_set_header X-Forwarded-Proto $scheme;不是可有可无的。$scheme在Nginx里代表客户端访问Nginx时用的协议。当前面那个HTTP的server块配置了return 301 https://之后实际进入HTTPS server块的请求它的$scheme值自然就是https后端在接受请求头之后就能生成正确的HTTPS链接。有些后端框架还要求额外的配置比如Django需要设置SECURE_PROXY_SSL_HEADERSpring Boot需要配置server.forward-headers-strategy。这些细节在代理配置“看起来正常”但功能有偏差时是排查的主要方向。5. 踩坑实录常见问题与排查技巧5.1 高频报错速查表我整理了一些实际部署中最常遇到的问题做成了一张速查表现象典型报错常见原因解决方案网关报错502 Bad Gateway后端服务没启动或proxy_pass端口与后端实际监听端口不一致检查后端进程是否存活核对proxy_pass地址网关超时504 Gateway Timeout后端响应太慢Nginx默认等待时间较短在location中加入proxy_read_timeout 120s;访问被拒403 Forbidden后端或静态文件目录权限不够或禁止访问规则生效检查目录权限和Nginx的deny规则配置证书告警NET::ERR_CERT_AUTHORITY_INVALID使用了自签名证书或证书链不完整换可信证书或把自签名CA导入系统信任库重定向太多次ERR_TOO_MANY_REDIRECTS反向代理头配置错误最常见于X-Forwarded-Proto没传后端以HTTP判断当前请求并强制要求HTTPS跳转检查并添加X-Forwarded-Proto头页面打开但资源失败浏览器报404、样式丢失前端资源路径是绝对路径没有经过正确的location匹配检查location规则和proxy_pass末尾的斜杠说明一下几个主要问题的排查思路。502是最常见的几乎可以断定是后端没通。先看后端进程是否还活着再看Nginx所在服务器能否直接curl到后端地址。504通常是后端处理慢注意不是Nginx卡住而是你真的给后端发请求了后端迟迟不回应。这时候还要看后端日志里有没对应的慢请求记录。403大概率是权限问题Nginx进程对静态文件目录没有读取权限或者配置里不小心写了deny规则。5.2 日志是最诚实的排查工具遇到问题别瞎猜去看日志。Nginx的日志通常分为访问日志和错误日志默认路径一般是这样access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;查看错误日志是定位Nginx自身问题的第一步tail -f /var/log/nginx/error.logtail -f能持续跟踪日志文件的输出你在另一边触发请求这边就会实时刷新。如果Nginx在转发过程中报错错误日志里会给出相当明确的线索比如连接后端失败、SSL握手错误、配置文件语法问题等。访问日志记录的则是每个请求的访问状态码和响应时间。比如后台系统响应突然变慢那你可以看访问日志里的request_time字段如果某条接口的响应时间明显偏高再顺着去查后端的慢日志。一条非常实用的思路是先确认Nginx错误日志里有没有内容再看后端服务日志有没有对应记录。如果Nginx这边没有报错、后端也没有收到请求说明请求可能在Nginx内部就被丢弃了问题大概率在配置匹配规则上。如果后端收到了请求但响应异常那焦点就要转到业务代码层面。5.3 proxy_pass的斜杠之争这个坑很经典。proxy_pass分为不带斜杠和带斜杠两种写法效果完全不同。看下面两组对比# 写法A不带斜杠 location /admin/ { proxy_pass http://127.0.0.1:8080; } # 访问 /admin/login - 转发到 http://127.0.0.1:8080/admin/login# 写法B带斜杠 location /admin/ { proxy_pass http://127.0.0.1:8080/; } # 访问 /admin/login - 转发到 http://127.0.0.1:8080/login可以看到带斜杠时location中匹配到的那部分前缀这里就是/admin/会被替换掉然后拼接到proxy_pass后面不带斜杠时原始URI完整地拼接到后端地址后面。所以如果你的后端接口路径里本身就有/admin前缀用A写法才能正确转发如果后端路径里没有这个前缀就要用B写法去掉前缀。这行配置造成的后果往往非常隐蔽页面能打开但接口全部404或者样式加载不出来。因为前端静态界面确实是返回了的但里面的API路径经过替换后已经对不上后端了。遇到这种情况先怀疑这里的斜杠问题。5.4 reload和restart别滥用配置改完后我习惯用nginx -t先验证语法然后systemctl reload nginx。reload采用的是新老进程平滑过渡机制不会中断当前正在处理的请求对于生产环境来说这是最稳妥的操作。systemctl restart nginx则会彻底停止Nginx再启动会导致一瞬间的访问中断以及所有TCP长连接被切断。一般只有两种情况会让我选择重启一是Nginx版本升级或模块加载需要初始化新进程二是出现罕见的内存泄漏或文件句柄耗尽需要完全重来。日常调整配置无论改了server_name、proxy_pass还是证书一律用reload。这是一个值得养成的操作习惯。6. 前后端分离后台系统的补充配置6.1 静态资源和API分开代理很多后台管理系统是前后端分离架构前端是一套静态页面Vue/React等构建产物后端是独立的API服务。这种情况下一个proxy_pass往往不够用需要把静态资源和API请求分开处理。假设前端构建产物放在了服务器的/opt/admin-web/dist目录后端API跑在127.0.0.1:9080那Nginx配置可以这样写server { listen 443 ssl; server_name admin.example.com; ssl_certificate /etc/nginx/ssl/admin.example.com.crt; ssl_certificate_key /etc/nginx/ssl/admin.example.com.key; location / { root /opt/admin-web/dist; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:9080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }第一个location /负责静态文件服务try_files是这里的关键。它的作用是优先判断请求路径是否对应一个真实存在的文件如果存在就返回该文件如果不存在就尝试当成目录处理最后一切不命中都回退到index.html。这样刷新页面时不管路由是/dashboard还是/user/list服务器都会返回前端的入口页面由前端路由自己处理展示逻辑。第二个location /api/则是把所有以/api/开头的请求转发给后端服务。这里后端需要确认自己的接口前缀确实能对上。比如后端接口原来是http://127.0.0.1:9080/user/list那前端的请求地址就应该写成/api/user/list然后Nginx用带斜杠的写法去掉/api/前缀后转发为http://127.0.0.1:9080/user/list。如果不想去掉前缀就按前面说的用不带斜杠的写法。6.2 前端history路由刷新404问题做了上面的配置一个最典型的问题就浮出水面了很多前端框架用了history模式路由。所谓history路由是浏览器地址栏中的路径和真实的文件路径不再一一对应比如地址栏是/login但磁盘上并没有login.html文件。如果你在第一个location /里没有配置try_files直接刷新/login页面Nginx会寻找名为login的文件或目录找不到就返回404。这就是所谓“前端history路由刷新后404”的根源。解决办法就是前面写的try_files $uri $uri/ /index.html;。它让所有miss的文件请求都回退到index.html前端路由收到这个页面后会根据URL自动展示对应页面。这一行几乎可以视作前端部署场景的标配。注意try_files的$uri不会命中/但$uri/会尝试作为目录最终回退到/index.html。这个写法的顺序不建议调换一旦把$uri/放在前面遇到目录请求时可能返回目录列表在某些服务器配置下反而暴露目录结构。6.3 反向代理到多个后端当同一个域名下的不同路径需要转发到不同的后端服务时也很常见。比如/admin/走管理后台A服务/report/走报表服务B配置就按路径拆成多个locationlocation /admin/ { proxy_pass http://127.0.0.1:8080; } location /report/ { proxy_pass http://127.0.0.1:9090; }这样做的好处是对外永远只是一个统一入口对用户来说域名是唯一的不会暴露端口路径的细节。将来无论后端如何拆分、扩容、迁移外部地址不用变。7. 最后分享一点实际体会回过头来看域名访问这个事技术上并不复杂但它对一个系统的交付体验影响是巨大的。给后台管理系统配上域名和Nginx不单单是改几行配置它意味着一套系统从“能跑”变成了“好用”从“开发自嗨”变成了“可以交给业务方正经使用”。我在实际配置过程中形成的几个习惯值得你参考。第一所有配置文件先放conf.d目录下独立成文件用域名命名比如admin.conf这样以后找配置非常直观。第二每次改完一定先nginx -t再reload没有例外。第三Nginx的错误日志保持常开排查问题时第一个看它不靠猜。第四遇到HTTPS相关的怪异跳转问题先检查X-Forwarded-Proto。如果你配置完这个系统用域名能正常打开、登录、操作再回头看看那些还在用IP加端口分发给同事的兄弟你会有一种明显的感觉这一步做得值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑