让jar包监听本机端口,再用Nginx把域名指向那个端口。很多新手栽跟头不是因为Java程序本身,而是没搞懂域名、端口、服务器三者之间的流转关系,下面把这套流程掰开揉碎讲清楚,你照着做就行。
为什么连着服务器IP能打开,换成域名就不行
这不是玄学,纯粹是“入口”变了,浏览器访问 `http://IP:8080` 时,请求直接打到服务器的8080端口;换成 `http://域名` 后,浏览器默认只走80端口或443端口,你服务器上的jar包项目通常监听8080或某个随机端口,如果没做好“转发”,请求根本到不了jar包那里。
先弄懂端口封闭的三个原因
– 云服务商安全组没放行对应端口,这是最常见的原因。
– Linux防火墙(firewalld或iptables)拦截了外部访问。
– jar包本身只绑定了127.0.0.1,没绑定0.0.0.0。
验证一下你的jar包监听在哪里
在服务器上执行这个命令:
netstat -tlnp | grep java
如果看到 0.0.1:8080 而不是 0.0.0:8080,那就是绑定问题,启动时加个参数:
java -jar your-project.jar --server.address=0.0.0.0
Nginx反向代理是标准做法,别用redirect
行业共识认为,Nginx反向代理是让jar包项目通过域名访问的最优解,它能统一管理80和443端口,还能顺带解决跨域、静态资源分离、负载均衡等问题。
一个能直接抄的Nginx配置
假设你的jar包监听8080端口,域名是 `example.com`,配置文件放在 `/etc/nginx/conf.d/example.com.conf`:
server {
listen 80;
server_name example.com www.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;
}
}
改完后测试配置并重载:
nginx -t nginx -s reload
为什么要加proxy_set_header那三行
很多jar包里的日志、会话管理、动态生成链接都依赖这些请求头,不加的话,后端拿到的客户端IP全是Nginx服务器的内网IP,某些框架(比如Shiro或Spring Security)的会话验证会直接失效。
如果不想用Nginx,还能怎么办
– 改jar包直接监听80端口:用 `–server.port=80` 启动,但这需要root权限,而且对多项目部署非常不友好。
– 用云服务商的负载均衡器:在简米云或酷番云上配一个SLB,监听80端口,后端指向8080,这个方案适合已经有负载均衡实例的情况,但有额外费用。
域名解析和备案,别跳过这一步
在云厂商控制台把域名解析到服务器IP,类型选A记录,这一步骤比较简单,但两个坑特别提醒:
备案问题:服务器在境内必须备案
如果你的服务器在中国大陆境内,域名解析到IP后,直接访问80和443端口会被检测拦截,这是工信部的强制要求,据工信部公开信息,未备案域名无法使用境内服务器提供Web服务,备案周期通常7-20天,如果你着急上线,短期方案是用IP加非标准端口(`http://IP:8080`)先顶上,但这完全不符合正式场景,而且会被搜索引擎和浏览器双重提示不安全。
解析生效时间与TTL
解析添加后不是立即生效的,默认TTL是10分钟或更久,你可以先用本机命令行验证:
ping example.com
或者:
nslookup example.com
等返回的IP是你服务器IP的时候,说明解析已经生效了。
配完HTTPS证书,域名才算真正“正规军”
现在浏览器对没有HTTPS的站点会有“不安全”的标记,对用户信任度影响很大,给Nginx配SSL证书用免费的就够了Let’s Encrypt或者简米云/酷番云的免费证书都行。
用certbot一次性搞定证书申请和自动续期
安装Certbot然后执行:
certbot --nginx -d example.com -d www.example.com
它会自动修改Nginx配置,加上SSL相关设置,别忘了加个定时任务自动续期:
crontab -e
添加一行:
0 3 /usr/bin/certbot renew --quiet
证书配置完成后的Nginx片段
“`nginx
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
“`
配完SSL后,原来的80端口请求建议做一个302跳转到HTTPS:
server {
listen 80;
server_name example.com;
return 302 https://$host$request_uri;
}
分不清反向代理和转发?一张表说明白
很多人在Nginx和jar包之间搞混,看下面这个对比就清楚了:
| 对比项 | Nginx反向代理 | 直接端口转发(iptables) |
|---|---|---|
| 核心作用 | 根据域名或路径转发请求 | 纯粹改数据包目的地 |
| 支持HTTPS | 是,直接配置证书 | 否,还是明文传输 |
| 多域名多项目 | 支持,一个Nginx管多个域名 | 每个项目都要占一个独立端口 |
| 修改配置后 | nginx -s reload热加载 |
需要重刷防火墙规则 |
| 适合场景 | 大多数生产环境 | 临时应急、网络层调试 |
绝大多数情况你都该用Nginx,别碰iptables转发那会让你在排查问题时掉进数据包的深坑里。
本地测试走一遍完整流程
技术在部署前最好在本地模拟一遍,Windows或Mac本机都行:
改本地hosts文件模拟域名解析
编辑 `C:WindowsSystem32driversetchosts`(Windows)或 `/etc/hosts`(Mac/Linux),加上一行:
0.0.1 example.com
然后本地启动jar包:
java -jar your-project.jar
再用Nginx本地监听80端口(Windows上也是可以装的),这样你在浏览器里访问 http://example.com 就能模拟整个链路,排查逻辑跟服务器上完全一致。
本地验证通过后,上服务器的顺序
1. 先把jar包传上服务器并启动成功。
2. 再用 `curl http://127.0.0.1:8080` 确认本机可访问。
3. 然后配置Nginx并重载。
4. 最后改域名解析指向服务器公网IP。
5. 等解析生效后,用 `curl -I http://example.com` 验证返回状态码。
排查思路:域名访问不了就按这条线查
按自底向上的顺序查,别上来就改配置。
- 查域名解析:
nslookup example.com,看返回IP是否等于服务器公网IP。 - 查安全组/防火墙:在云控制台确认80和443端口已放行;服务器上执行
firewall-cmd --list-ports确认。 - 查Nginx进程:
systemctl status nginx,看是否在运行。 - 查Nginx日志:
tail -f /var/log/nginx/error.log,看有没有代理错误。 - 查jar包进程:
ps aux | grep java,确认jar包还在跑,没被OOM杀掉。
典型症状与对应原因
| 症状 | 大概率原因 |
| — | — |
| 域名打开显示404页面 | jar包上下文路径不对,或Nginx代理路径没对上 |
| 域名打开但连接被重置 | 80/443端口安全组没放行 |
| 页面出来了但图片和样式全丢 | 静态资源路径是绝对路径,没走域名 |
| 访问时快时慢 | jar包绑定的端口有多个服务抢占,或Nginx没开长连接 |
这几种场景下的jar包域名访问怎么配
不同业务属性有各自的坑,单独说一下。
一个域名带多个jar包项目
用路径区分,不用开新域名,Nginx里写多个location:
location /projectA/ {
proxy_pass http://127.0.0.1:8081/;
}
location /projectB/ {
proxy_pass http://127.0.0.1:8082/;
}
注意 proxy_pass 结尾的斜杠,不加斜杠和加斜杠是两种完全不同的转发方式,最容易出错的就是这里。
jar包项目要同时支持WebSocket
Nginx代理层需要多配两个header,否则WebSocket握手会失败:
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
服务器在海外的场景
如果服务器在境外,不需要备案,但域名解析建议用云厂商自带的DNS,别用第三方DNS,因为某些国外的公共DNS(你懂的)在国内解析速度不稳定,这会影响国内用户访问速度,这个场景下域名访问延迟主要取决于网络链路,配置层面没什么特别的。
常见问题问答
jar包项目域名访问返回502 Bad Gateway是什么原因
502说明Nginx已经收到请求但转发不到后端,最常见的原因有三个:jar包进程挂了、jar包监听的不是127.0.0.1(比如在Docker容器里)、或者`proxy_pass`里的端口写错了,按顺序检查jar包进程状态、监听地址、Nginx配置文件,基本能快速定位。
只能用IP的服务器能不能绑定域名
可以,域名解析A记录直接指向这个IP就行,不需要服务器本身有什么特殊配置,但要注意如果这个IP是动态的,域名解析就会失效,建议用内网穿透或动态DNS方案。
域名在国内服务器上有备案但访问还是很慢
慢的原因通常不在备案层面,而是带宽和节点问题,检测一下你的带宽是不是1M的共享带宽,然后看Nginx是否开了gzip压缩,再考虑资源是否用了CDN,大多数1M带宽的服务器跑个小型jar项目基本够用,但图片多就要上CDN了。
配好域名访问这件事,本质上就是把容器的端口映射到系统端口,再把系统端口交给Nginx按域名规则分发,把握住这个逻辑,后续不管是换端口、加证书还是加项目,都能顺手搞定。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/736109.html




