Nginx 配置记录-未完!

目的

Nginx和前端后端的关系都是密不可分的,但是它的配置又是很多的,我们有一些不常用的,所以我们要总结下来,这里我们提供一个样例,每次有新的配置,就先修改样例,让我们有迹可循,看着样例实地举例才可。

样例

http{
	server {
    	listen 80;
    	upstrem mgr{
    		ip:port;
		}
    	location / {
    		proxy_pass http://mgr;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_http_version 1.1;
            proxy_redirect    off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
        
	}
}
  • proxy_pass http://bsfitgateway-credit:表示将请求反向代理传递给 http://bsfitgateway-credit这个后端服务器

  • proxy_set_header Upgrade $http_upgrade:表示如果是upgrade的请求(下方有解释),如WebSocket,就将Upgrade头传递给后端服务器

  • proxy_set_header Connection “upgrade”: 同样表示将Connection头传递给后端服务器

  • proxy_http_version 1.1: 指定使用HTTP/1.1协议与后端服务器通信

  • proxy_redirect off:表示不需要重写Location和Refresh响应头。(详细解释看下面)

  • proxy_set_header X-Real-IP $remote_addr:将客户端真实IP传递给后端服务器,存入X-Real-IP头

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:将客户端IP加入X-Forwarded-For头并传递给后端服务器

其中$remote_addr和$proxy_add_x_forwarded_for是Nginx的系统变量,分别表示客户端IP和记录了所有经过的客户端IP的X-Forwarded-For头值。

常见的Nginx系统变量还有:

参数名 含义
$remote_addr 客户端IP
$proxy_add_x_forwarded_for 记录了所有经过的客户端IP的X-Forwarded-For头值。 下方详解
$http_upgrade 表示请求是否为upgrade类型,如WebSocket
$upstream_addr 后端服务器的IP地址和端口 ​
$upstream_status 后端服务器返回的状态码
$request_method 客户端请求方法,如GET、POST
$remote_port 客户端端口
$remote_user 客户端用户名,如果有进行认证
$scheme 请求使用的协议,如http或https
$request_uri 客户端原始请求的完整URI
$query_string 请求中的参数字符串
$host 请求头中的Host值
$server_port 处理请求的服务器端口号
$server_name 服务器名称,即nginx.conf中的server_name指令配置的值
$request_filename 请求中的文件名,不带请求URI
$document_root 与请求对应的根目录
$request_body 请求的主体内容(body) ​
$content_type 响应的Content-Type头字段值
$args 请求中的参数,等同于$query_string
$content_length 响应的Content-Length头字段值
$tcpinfo_rtt TCP连接的往返时延
$pid 工作进程的PID
$msec 当前时间,单位为秒+毫秒 ​
$time_iso8601 以ISO8601标准格式的当前时间
$nginx_version nginx版本号 ​
$ssl_protocol 如果为HTTPS,加密协议如TLSv1
$ssl_cipher 如果为HTTPS,加密算法如AES128

​ 这些变量都可以获取各种请求、响应、服务器上下文信息,用于实现Nginx配置功能。

proxy_add_x_forwarded_for

在Nginx中,$proxy_add_x_forwarded_for是一个系统变量,它表示请求头中X-Forwarded-For字段的值。

X-Forwarded-For请求头用来表示代理或者负载均衡后面的客户端原始IP地址。

当请求通过多个代理或者负载均衡服务器时,每个服务器都会将自己收到的来源IP地址添加到X-Forwarded-For头信息中,格式如下:

X-Forwarded-For: client_ip, proxy_1_ip, proxy_2_ip

Nginx upstream模块会自动将来自客户端的IP地址追加到X-Forwarded-For头中。

$proxy_add_x_forwarded_for变量的值就是这个完整的X-Forwarded-For头字段的值。

remote_addr 和 proxy_add_x_forwarded_for的区别

$remote_addr:只包含客户端与Nginx直接建立连接时的IP,而不是经过代理或负载均衡后的IP

区别是:

  • $remote_addr - 直接连接的客户端IP
  • $proxy_add_x_forwarded_for - 通过代理或负载均衡后的原始客户端IP

如果没有使用代理或负载均衡,$remote_addr 和 $proxy_add_x_forwarded_for返回相同的值。

如果使用了代理或负载均衡,$proxy_add_x_forwarded_for包含原始客户端IP,而$remote_addr只包含代理服务器的IP。

$remote_addr通常用于访问控制、日志、统计等需要客户端真实IP的场景。也可以与proxy_set_header配合传递给上游服务器。

所以简单来说:

  • $remote_addr代表直接连接客户端的IP地址
  • $proxy_add_x_forwarded_for代表经过代理后的原始客户端IP地址。

upgrade 请求说明

upgrade请求是指客户端或服务器试图将与HTTP不同的其他协议用于通信的请求。

其中最常见的就是WebSocket(Web套接字)。WebSocket使用HTTP进行初始握手,但之后升级为WebSocket协议用于长连接的双向通信。

具体来说,upgrade请求必须发送Upgrade头字段表示要升级协议,并在Connection头字段中包含"upgrade"表示这是一个升级请求。

例如:

GET /chat HTTP/1.1

Host: example.com

Upgrade: websocket

Connection: Upgrade

服务器如果同意升级,会返回:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

之后通信就会切换到WebSocket协议。

除了WebSocket,upgrade还可以用于升级到其他应用层协议,如实现流媒体传输等。需要客户端和服务器都支持该协议。

在Nginx中,proxy_set_header Upgradeproxy_set_header Connection "upgrade"用于将upgrade请求透传给后端服务器,以实现协议的升级。

proxy_redirect 详解

proxy_redirect指令用于修改后端服务器响应中的Location、Refresh等重定向头字段

当Nginx进行反向代理时,后端服务器返回的重定向LOCATION可能是后端服务器的内部地址,而非可访问的外部地址。proxy_redirect可以重写这些地址,使重定向到外部可访问的地址。

例如:

上游服务器返回的LOCATION: http://internal.example.com/path 这是后端服务器的地址

可以用proxy_redirect重写为:

proxy_redirect http://internal.example.com/ http://external.example.com/ 后者是外部可以访问的地址

那么LOCATION会被重写为:http://external.example.com/path

这样就可以将后端服务器返回的内部域名重定向到外部可访问域名上。

proxy_redirect 默认为off,表示不重写。

可以通过正则表达式进行复杂重写:

proxy_redirect ~^(http://[^:]+):\d+(/.*)$ $1$2;

这个例子表示去掉内部重定向URL中的端口号。

proxy_redirect也可以设置为默认参数,表示重写为nginx.conf中设置的代理传递的服务器名称:

proxy_redirect default;

如果代理传递的是http://example.com,那么重定向会直接改写为这个域名。

注意

注意的是,proxy_redirect只会修改重定向的头部,而不会修改内容中的URL。

主要应用场景

  • 后端服务器内部使用私有域名,需要重定向到公网域名
  • 部署时后端服务器域名变更,但不方便修改后端配置
  • 需要将流量引导到外部特定域名
  • 后端服务器域名不稳定,需要灵活调整

你可能感兴趣的:(linux,centos,服务器,nginx)