一、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