DJVPS820

Nginx端口转发怎么配置?Linux服务器端口转发

Nginx端口转发是Linux服务器部署中比较常见的一种网络配置方式,很多人在搭建网站、API服务、面板、Docker应用或者内网服务时,都会遇到“外部端口无法直接访问,但后端程序已经正常运行”的情况,这时候就可以通过Nginx监听服务器公网端口,再将收到的请求转发到指定的本机端口或其他服务器端口。对于刚接触Linux服务器的人来说,端口转发看起来比较复杂,其实核心逻辑并不难理解:Nginx负责监听客户端访问的端口,然后根据配置把请求交给后端服务处理,后端处理完成以后,再由Nginx把结果返回给客户端。本文主要介绍Linux服务器上如何配置Nginx端口转发,包括常见配置方法、端口检查、防火墙设置、反向代理、TCP转发区别以及配置完成后的排错方法。

Nginx端口转发到底是什么

很多人搜索“Nginx端口转发怎么配置”,实际上首先需要分清楚这里所说的端口转发到底是哪一种。Nginx最常见的方式并不是传统意义上的Linux NAT端口映射,而是通过反向代理把客户端发送到某个端口的HTTP或HTTPS请求转交给后端服务。例如一台Linux服务器公网IP为1.2.3.4,服务器上的Node.js程序运行在127.0.0.1:3000,由于3000端口没有直接开放到公网,因此用户访问http://1.2.3.4:80时无法直接得到Node.js页面。这时候可以让Nginx监听80端口,再把请求转发到127.0.0.1:3000

从访问过程来看,用户实际上访问的是Nginx,而不是直接访问3000端口。Nginx收到HTTP请求后,根据proxy_pass配置将请求发送给后端程序。后端程序处理请求之后,将响应返回给Nginx,Nginx最后再将结果返回给浏览器。因此,从实际使用角度来说,很多所谓的“Nginx端口转发”,更准确的说法是“Nginx反向代理”。

这种方式在Linux服务器上非常实用,因为后端服务可以只监听本地地址,不需要直接暴露公网端口。例如网站使用8080端口、宝塔中的某个应用使用3000端口、Python Flask使用5000端口、Node.js使用3000端口,都可以通过Nginx统一使用80或者443端口对外提供服务。这样不仅方便访问,也可以减少直接开放大量端口带来的管理问题。

Linux服务器配置Nginx端口转发前需要检查什么

正式修改配置之前,建议先确认Nginx是否已经安装,以及后端程序到底运行在哪个端口。Linux服务器上可以使用下面的命令检查Nginx:

nginx -v

如果服务器返回类似:

nginx version: nginx/1.30.2

说明Nginx已经安装。

如果提示:

command not found

则需要先安装Nginx。以Ubuntu或Debian为例:

apt update
apt install nginx -y

CentOS、Rocky Linux、AlmaLinux等系统的安装方式可能有所不同。

接下来需要确认后端程序的监听端口。例如你的程序应该运行在3000端口,可以使用:

ss -lntp

也可以针对3000端口进行查询:

ss -lntp | grep 3000

如果看到类似:

LISTEN 0 511 127.0.0.1:3000 0.0.0.0:* users:(("node",pid=1234,fd=20))

说明程序确实监听在3000端口。

这里有一个非常容易被忽略的问题,就是程序监听的是127.0.0.1:3000还是0.0.0.0:3000。如果Nginx和后端程序在同一台服务器上,两种方式通常都可以通过Nginx访问。对于不需要直接提供公网访问的后端服务,监听127.0.0.1反而比较常见,因为外部用户无法直接访问这个端口。

如果程序运行在另外一台服务器上,例如Nginx服务器IP为1.2.3.4,后端服务器IP为5.6.7.8,后端程序运行在8080端口,那么Nginx也可以将请求转发到:

http://5.6.7.8:8080

不过这时候还需要确保Nginx服务器能够连接后端服务器的8080端口。

Nginx端口转发最常用配置方法

假设现在有一个网站程序运行在:

127.0.0.1:3000

希望用户直接访问:

http://你的服务器IP

或者访问一个域名:

https://example.com

而不需要在浏览器地址栏输入:3000,那么可以通过Nginx反向代理实现。

首先创建或者修改Nginx站点配置文件。例如:

nano /etc/nginx/conf.d/example.conf

加入:

server {
    listen 80;
    server_name 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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

保存配置之后,先不要急着重启Nginx,建议先检查配置文件是否存在语法问题:

nginx -t

如果显示:

syntax is ok
test is successful

说明配置语法基本没有问题。

然后重新加载Nginx:

systemctl reload nginx

或者:

nginx -s reload

此时用户访问:

http://example.com

Nginx就会把请求转发到:

http://127.0.0.1:3000

这就是Linux服务器上最典型的Nginx端口转发。

proxy_pass应该怎么写

Nginx端口转发配置中,最关键的一行通常就是:

proxy_pass http://127.0.0.1:3000;

这里的127.0.0.1代表本机,3000代表后端应用端口。

如果后端运行在本机8080端口:

proxy_pass http://127.0.0.1:8080;

如果后端运行在5000端口:

proxy_pass http://127.0.0.1:5000;

如果后端是另一台服务器:

proxy_pass http://192.168.1.100:8080;

如果是公网服务器:

proxy_pass http://5.6.7.8:8080;

不过实际生产环境中,不建议仅仅把proxy_pass写进去就结束。很多程序需要正确获取客户端IP、Host、HTTPS协议等信息,所以通常还会配合:

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;

例如用户真实IP是8.8.8.8,如果没有正确设置代理请求头,后端程序有可能看到的只是Nginx服务器IP。对于日志统计、访问控制、后台安全以及部分应用程序来说,这可能会造成问题。

Nginx从80端口转发到3000端口

这是实际使用中非常常见的场景。

例如Node.js程序运行:

127.0.0.1:3000

Nginx监听:

0.0.0.0:80

配置:

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:3000;

        proxy_http_version 1.1;
        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;
    }
}

这种配置意味着外部用户只需要访问服务器IP:

http://服务器IP

就可以访问3000端口上的程序。

需要注意的是,这并不是把服务器的3000端口“复制”到了80端口,而是Nginx在80端口接收HTTP请求,然后主动与3000端口的应用建立连接。因此Nginx和后端程序实际上承担的是不同角色。

Nginx从443端口转发到内部HTTP端口

如果网站需要HTTPS,实际环境中经常是:

用户
 ↓
HTTPS 443
 ↓
Nginx
 ↓
HTTP 3000
 ↓
Node.js

例如:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    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;
        proxy_set_header X-Forwarded-Proto https;
    }
}

这种架构非常常见。浏览器和Nginx之间使用HTTPS加密,而Nginx与本机3000端口之间可以继续使用HTTP,因为这段通信通常发生在同一台服务器内部。

如果你使用Let’s Encrypt等证书工具,也可以让Nginx负责HTTPS证书和外部访问,而后端程序只负责业务逻辑。对于多个Web应用来说,这种方式尤其方便,因为一台服务器只需要由Nginx统一管理80和443端口,就可以根据不同域名将请求分发到不同后端端口。

一个Nginx服务器转发多个端口

假设服务器上运行三个程序:

网站A:127.0.0.1:3000
网站B:127.0.0.1:5000
网站C:127.0.0.1:8080

可以通过不同域名进行转发。

例如:

a.example.com → 3000
b.example.com → 5000
c.example.com → 8080

配置可以写成:

server {
    listen 80;
    server_name a.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 {
    listen 80;
    server_name b.example.com;

    location / {
        proxy_pass http://127.0.0.1:5000;
        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 {
    listen 80;
    server_name c.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;
    }
}

这种方式比让每个应用直接占用公网80或443端口更加灵活,因为一台服务器上一个端口通常只能由一个服务监听。Nginx相当于站在最前面,根据域名、URL路径等条件把请求交给不同程序。

Nginx端口转发与Linux iptables端口转发有什么区别

这两个概念经常被混在一起,但实际上工作层次不同。

Nginx主要处理的是HTTP、HTTPS以及通过特定模块支持的其他网络协议,它属于应用层代理。典型配置是:

proxy_pass http://127.0.0.1:3000;

而Linux中的iptables或nftables端口转发更接近网络层和传输层,它可以进行DNAT、SNAT等操作。例如:

公网IP:10000
      ↓
Linux NAT
      ↓
内网IP:192.168.1.100:80

这种情况下,客户端甚至不需要知道后端真正的服务器地址。

如果你的需求是“访问一个网站域名,然后把HTTP请求转到Node.js、PHP、Python、Java等Web程序”,通常使用Nginx反向代理更合适。如果你的需求是“TCP端口原样转发到另外一台服务器”,那么就不能简单地把HTTP反向代理当成普通端口映射使用,需要根据具体协议选择Nginx stream、iptables、nftables、HAProxy等方案。

Nginx TCP端口转发怎么配置

如果要转发的不是HTTP请求,而是普通TCP连接,例如某些数据库、TCP服务或者其他自定义协议,那么传统的:

location / {
    proxy_pass http://127.0.0.1:3000;
}

并不适用。

如果Nginx编译时包含stream模块,可以使用类似:

stream {
    server {
        listen 10000;
        proxy_pass 127.0.0.1:20000;
    }
}

这样客户端连接服务器:

服务器IP:10000

Nginx就可以将TCP连接转发到:

127.0.0.1:20000

不过这里需要特别注意,stream与普通http配置不是一回事。不能把stream {}随便放进一个server {}里面,也不能把HTTP的location配置直接用于TCP转发。如果配置位置错误,执行nginx -t时就可能出现语法错误。

对于普通网站、WordPress、Node.js、Python Web、Java Web等HTTP应用,一般优先使用http模块中的反向代理,不需要为了简单的网页访问使用stream。

Linux防火墙需要开放哪些端口

Nginx配置正确并不代表外部一定能够访问。Linux服务器通常还涉及系统防火墙以及云服务器安全组。

例如Nginx监听80端口:

ss -lntp | grep :80

如果看到:

LISTEN 0 511 0.0.0.0:80

说明Nginx正在监听80端口。

如果使用UFW,可以检查:

ufw status

开放HTTP:

ufw allow 80/tcp

开放HTTPS:

ufw allow 443/tcp

如果是云服务器,还需要检查云平台控制台的安全组。例如阿里云、腾讯云、AWS、Google Cloud等平台通常都有自己的入站规则。即使Linux内部已经执行:

ufw allow 80/tcp

如果云服务器安全组没有允许80端口,外部依然可能无法访问。

因此遇到“Nginx端口转发不通”时,不要只检查Nginx配置,还需要依次确认后端服务、Nginx监听端口、Linux防火墙以及云服务器安全组。

Nginx端口转发失败的常见原因

配置完成之后,如果访问网站出现502 Bad Gateway,最常见的问题并不是Nginx本身,而是Nginx连接不到后端服务。例如配置:

proxy_pass http://127.0.0.1:3000;

但是3000端口实际上没有程序运行,就可能出现502。

首先检查:

ss -lntp | grep 3000

如果没有任何结果,就说明后端程序没有监听3000端口。

也可以直接从服务器本机测试:

curl http://127.0.0.1:3000

如果能够返回HTML或者JSON,说明后端程序基本正常。

如果:

curl http://127.0.0.1:3000

直接提示连接失败,那么就应该先检查Node.js、Python、Java或者其他后端程序,而不是继续修改Nginx。

另外一个常见问题是Nginx配置修改以后没有重新加载。修改完成后执行:

nginx -t

确认没有错误,再执行:

systemctl reload nginx

如果Nginx无法启动,可以查看:

systemctl status nginx

或者:

journalctl -u nginx -n 50

Nginx自己的错误日志通常也非常有帮助:

tail -f /var/log/nginx/error.log

访问网站的同时观察日志,通常能够比较快地找到问题。

为什么Nginx配置正确但外网还是访问不了

这种情况在云服务器上非常常见。例如后端程序监听:

127.0.0.1:3000

Nginx监听:

0.0.0.0:80

从服务器内部访问:

curl http://127.0.0.1

可以正常打开,但外部电脑无法访问。

这时候首先检查80端口:

ss -lntp | grep :80

如果Nginx只监听:

127.0.0.1:80

那么外部自然无法连接。应该根据实际需求让Nginx监听公网接口,例如:

listen 80;

然后检查Linux防火墙:

ufw status

再检查云服务器安全组是否允许TCP 80。

如果这些都没有问题,再检查域名DNS是否指向正确的公网IP。很多时候服务器配置本身没有问题,真正原因只是域名解析还指向旧服务器。

Nginx端口转发是否需要开放后端端口

如果后端程序和Nginx在同一台服务器上,而且后端只监听:

127.0.0.1:3000

那么通常不需要把3000端口开放给公网。

例如:

互联网
   ↓
TCP 80/443
   ↓
Nginx
   ↓
127.0.0.1:3000
   ↓
应用程序

外部用户只需要访问80和443。

这种架构的好处是后端服务不直接暴露公网,可以减少端口暴露,同时也可以让Nginx统一负责HTTPS、域名、访问日志、请求头、缓存和部分安全控制。

如果后端程序位于另一台服务器,则情况不同。例如:

用户
 ↓
Nginx服务器
 ↓
192.168.1.100:8080
 ↓
后端服务器

此时Nginx服务器必须能够访问后端服务器的8080端口。如果两台服务器之间存在安全组、防火墙或者网络ACL限制,也会导致Nginx代理失败。

配置Nginx端口转发时容易犯的几个错误

第一个错误是把“Nginx端口转发”和“Linux端口映射”完全当成同一个东西。实际上Nginx的HTTP反向代理主要处理HTTP请求,而iptables、nftables等工具可以从更底层进行网络地址转换。选择工具之前最好先确定自己要转发的是HTTP、HTTPS还是纯TCP/UDP流量。

第二个错误是后端端口根本没有服务。很多人在修改完Nginx配置后看到502,就不停修改proxy_pass,实际上只需要执行:

curl http://127.0.0.1:3000

就能发现后端程序本身没有启动。

第三个错误是忘记检查安全组。尤其是阿里云、腾讯云、AWS等云服务器,系统防火墙和云平台安全组是两个不同的层次。服务器内部允许80端口,并不代表公网一定能够访问80端口。

第四个错误是配置修改以后直接重启Nginx,而没有先执行:

nginx -t

更推荐的习惯是每次修改配置以后先测试:

nginx -t

确认:

syntax is ok
test is successful

然后再:

systemctl reload nginx

使用reload通常比直接restart更适合日常配置修改,因为它能够在尽量不中断现有连接的情况下重新加载配置。

Nginx端口转发实际排查顺序

如果你以后遇到“Nginx端口转发不成功”,可以按照下面的顺序排查,而不是直接反复修改配置。

首先确认后端程序是否启动:

ss -lntp

然后直接访问后端:

curl http://127.0.0.1:3000

如果这里就失败,先处理后端程序。

接下来检查Nginx配置:

nginx -t

然后确认Nginx监听:

ss -lntp | grep nginx

再从服务器本机访问Nginx:

curl http://127.0.0.1

如果本机可以访问、外部无法访问,就重点检查Linux防火墙、云服务器安全组和网络入口。

如果出现502,则重点查看:

tail -f /var/log/nginx/error.log

如果出现404,则需要检查locationproxy_pass以及后端程序实际路由。

如果出现301、302循环跳转,则需要检查HTTPS、域名以及后端应用本身的URL配置。

这种排查方法比单纯修改Nginx配置更加有效,因为一个端口转发请求实际上经过了多个环节,只要其中任何一个环节存在问题,最终访问结果都会异常。

总结

Linux服务器上的Nginx端口转发并不复杂,最常见的场景就是让Nginx监听公网80或443端口,再通过proxy_pass把HTTP请求转发到本机或者其他服务器上的应用端口。例如后端程序运行在127.0.0.1:3000,Nginx只需要监听80端口,并配置proxy_pass http://127.0.0.1:3000;,用户就可以直接通过域名访问后端应用,而不需要在地址中输入3000端口。

实际部署时,最重要的不是记住某一段Nginx配置,而是理解整个访问链路:客户端首先连接Nginx监听的公网端口,Nginx再连接后端服务,后端返回数据以后由Nginx发送给客户端。如果访问失败,就分别检查后端监听状态、Nginx配置、Nginx监听地址、Linux防火墙、云服务器安全组以及DNS解析。对于HTTP网站使用Nginx反向代理,对于纯TCP端口则应该根据实际协议考虑stream、iptables或nftables等方案。把这几个概念区分清楚以后,Linux服务器上的端口转发、反向代理以及多应用部署都会容易很多。

常见问题解答

Nginx端口转发一定要开放后端端口吗?

不一定。如果Nginx和后端程序在同一台服务器上,并且后端只监听127.0.0.1,通常不需要向公网开放后端端口。外部用户只需要访问Nginx的80或443端口即可。

Nginx出现502 Bad Gateway怎么办?

首先检查后端服务是否正常运行,然后执行:

curl http://127.0.0.1:3000

如果无法连接,优先检查后端程序。如果后端可以访问,再检查Nginx的proxy_pass配置以及/var/log/nginx/error.log错误日志。

Nginx能不能直接转发TCP端口?

可以,但HTTP反向代理和TCP转发使用的是不同配置。HTTP网站一般使用proxy_pass,而普通TCP连接通常需要使用Nginx的stream模块或者Linux的iptables、nftables等网络转发方案。具体选择取决于需要转发的协议和网络架构。

未经允许不得转载:djvps820 » Nginx端口转发怎么配置?Linux服务器端口转发