nginx配置端口转发

一、nginx代理http转发

nginx配置端口转发的功能是可以实现反向代理

可以配置nginx.conf文件或者在conf.d目录下加conf文件

示例代码如下:

server {
    listen  80;
    server_name     域名或者IP地址;
    location / {
        proxy_set_header Host $host;
        proxy_pass      http://127.0.0.1:8080; # 当你访问80端口可以实现向8080端口转发
    }
}

二、nginx转发还可以使用stream的方式,实现TCP/UDP代理

Nginx 的 TCP/UDP 代理功能的模块分为核心模块和辅助模块、核心模块 stream 需要在编译配置时增加“--with-stream”参数进行编译。核心模块的全局配置指令如下表所示。

参数名称 指令值格式 默认值 参数说明
listen address:port[ssl][udp][proxy protocol]
[backlog=number][rcvbuf=size]
-- stream 监听协议及端口
listen [sndbuf=size][bind][ipv6only=on 或 off]
[reuseport][so_keepalive=on 或 off 或
[keepidle]:[keepintvl]:[keepent]]
-- stream 监听协议及端口
preread_buffer_size size 16k 设置每个会话数据预读缓冲区的大小
preread_timeout timeout 30s 设置每个会话数据预读取的超时时间
proxy_protocol_timeout timeout 30s 读取代理协议头的超时时间
resolver address... [valid=time][ipv6=on 或 off] -- 域名解析服务器地址
resolver_timeout time 30s 域名解析超时时间
tcp_nodelay on 或 off on 启用或关闭立即发送数据(tcp_nodelay)选项
variables_hash_bucket_size size 64 设置变量哈希表中桶的大小
variables_hash_max_size size 1024 设置变量哈希表的最大值

关于上表有以下几点需要说明。

  • 指令 listen 使用的指令域范围为 server;
  • 指令 variables_hash_bucket_size 和 variables_hash_max_size 使用的指令域范围为 stream;
  • stream 核心模块其余指令使用的指令域范围为 stream、server;
  • resolver 指令值可填写多个域名解析服务器地址,各个地址用空格分隔;
  • listen 指令值参数如下表所示。
参数名称 默认 参数说明
ssl -- 在指定监听端口上启用 SSL 协议支持
udp -- 在指定监听端口上启用 UDP 协议支持
proxy_protocol -- 在指定监听端口上启用 proxy_protocol 协议支持
backlog -1/511 设置挂起连接队列的最大长度,在 FreeBSD、DragonFly BSD 和 macOS 操作系统上,设置默认值为 -1,其他平台为 511
rcvbuf -- 设置套接字(socket)接收缓冲区(SO_RCVBUF 选项)的大小,Linux 操作系统下默认值为内核参数 net.core.rmem_default 的值
sndbuf -- 设置套接字(socket)发送缓冲区(SO_SNDBUF 选项)的大小,Linux 操作系统下默认值为内核参数 net.core.wmem_default 的值
bind -- address:port 指定 IP 及端口
ipv6only on 只接收 IPv6 连接,或接收 IPv6 和 IPv4 连接
reuseport -- 在默认情况下,所有的工作进程都会共享一个 socket 去监听同一 IP 和端口的组合。该参数启用后,允许每个工作进程由独立的 socket 去监听同一 IP 和端口的组合,内核会对传入的连接进行负载均衡。目前,它只适用于 Linux 3.9+、DragonFly BSD 和 FreeBSD 12+
so_keepalive off 配置监听的端口启用 TCP keepalive 机制时的心跳检测参数。当指令值为 on 时,默认等同于 so_keepalive=30m::10,表示 30 分钟无数据传输时发送探测包,总共发送 10 次,发送时间间隔为系统内核参数 tcp_keepalive_intvl 的设定值

配置样例如下:

stream {
    resolver 114.114.114.114 valid=300s; 
    resolver_timeout 2s;

    upstream backend {
       server 192.168.0.1:333;
       server www.example.com:333;
    }

    server {
        listen 127.0.0.1:333 udp reuseport;
        proxy_timeout 20s;
        proxy_pass backend;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}

三、配置参数说明:

listen:
表示你该配置的server所监听的端口号。

server_name:
用于设置虚拟主机服务名称,如:127.0.0.1 、 localhost 、域名

例如,在windows本地主机上进行修改该配置,则当访问该名称时会被nginx拦截,这里或者直接在C:\WINDOWS\system32\drivers\etc\hosts修改,也能达到此效果。

location :
location后面跟着的路径匹配是你访问80端口时所匹配的路径,当匹配到该路径时会被拦截,并进行路径转发。你可以在一个server里面配置多个location。

proxy_set_header:

参考nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port区别-CSDN博客

proxy_pass:

你所想转发的路径。

proxy_redirect:

用来设置url重定向

四、问题解决:

解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题

# 安装nginx源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 先安装
yum -y install epel-release

#应该是缺少modules模块
yum -y install nginx-all-modules.noarch
然后在用nginx -t就好了
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

你可能感兴趣的:(nginx,nginx,服务器,运维)