Nginx常用功能

发布时间:2024年01月08日

一、 静态资源服务

location

server {
  listen 80;
  server_name _;
  access_log /var/log/nginx/access.log json;
  location /test {
    alias /data/web/test;
    index index.html index.htm;
  }
}

二、反向代理

proxy_pass

server {
  listen 9090;
  server_name _;
  access_log /var/log/nginx/access.log json;
  location / {
  	proxy_pass http://192.168.9.10:9090;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  }
}

其中,proxy_set-header允许重新定义或者添加发往后端服务器的请求头

proxy_set_header Host $host;
#获取客户端真实IP。设置的话,nginx代理后端服务器获取到的是nginx的ip
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header REMOTE-HOST $remote_addr;
# 经过多重代理,仍能获取客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

三、负载均衡

proxy_pass、upstream

upstream gateway {
  server 192.168.9.30:9031;
  server 192.168.9.31:9031;
}

server {
  listen 9031;
  server_name _;
  access_log /var/log/nginx/access.log json;
  location / {
  	proxy_pass http://gateway;
  }
}

其中负载均衡有这几种常用的算法:轮询、权重、ip_hash。
其中后端服务器可以设置的常用状态有:

upstream bakend{ 
      ip_hash; 
      server 192.168.0.1:90 down; 
      server 192.168.0.1:80 weight=2; 
      server 192.168.0.2:90; 
      server 192.168.0.2:80 backup; 
}


down:表示当前的server暂时不参与负载均衡
weight:默认为1,weight越大,负载的权重越大
backup:预留的备份机器。当其他所有非backup机器出现故障或者忙碌的时候,才会请求backup机器,因为此台机器访问压力最低。

max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误
fail_timeout:请求失败超时时间。在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用

四、SSL证书

ssl

server {
    listen       443 ssl;
    server_name  test.test1.com;
    access_log  /data/nginx/logs/access.log;
    error_log /data/nginx/logs/error.log;
   
    ssl_certificate     /data/nginx/conf/crt/test.pem; 
    ssl_certificate_key /data/nginx/conf/crt/test.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    
    location /{
        root /data/nginx/html/;
    }
}

解析如下:

# ssl证书的位置
ssl_certificate     /data/nginx/conf/crt/test.pem; 
# ssl私钥的位置
ssl_certificate_key /data/nginx/conf/crt/test.key;
# ssl会话超时时间
ssl_session_timeout 5m;
# nginx使用的ssl密码套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 是否在客户端和服务器之间选择服务器提供的密码套件作为首选项;设置为on,表示优先使用服务器端提供的密码套件    
ssl_prefer_server_ciphers on;

五、TCP/UDP数据流代理

stream

# 代理后端达梦数据库端口,使外部能够访问
# 可以放在文件第一行
load_module modules/ngx_stream_module.so; 
http {

}

stream {
  server {
    listen 15236;
    proxy_pass 192.168.0.23:15236;
  }
}

六、开启WebSocket代理

map $http_upgrade $connection_upgrade {
          default upgrade;
          '' close;
} 
server {
        listen       9038;
        server_name  _;
 
 
        location / {
        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_pass http://192.168.0.210:9038;

        proxy_http_version 1.1;
        proxy_read_timeout 60s;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        }
}

(一)配置解析

map $http_upgrade $connection_upgrade {
          default upgrade;
          '' close;
} 
server {
        listen       9038;
        server_name  _;
 
 
        location / {
        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_pass http://192.168.0.210:9038;

        # 确保Nginx使用HTTP 1.1版本与后端服务器进行通信;1.1版本支持处理HTTP握手过程中的特殊头部处理
        proxy_http_version 1.1;
        # 设置代理的读取超时时间为 60 秒,即如果在 60 秒内没有从后端服务器接收到数据,代理将会中断连接。
        proxy_read_timeout 60s;
        # 将客户端的Upgrade头部传递给后端服务器。当$http_upgrade为websocket或不为空时,$connection_upgrade为upgrade;当$http_upgrade为空时,$connection_upgrade为close,根据上边的map进行映射。
        proxy_set_header Upgrade $http_upgrade;
        # 将Connection传递给后端服务器。
        proxy_set_header Connection $connection_upgrade;
        }
}

(二)简介

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间能够双向通信。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

(三)原理

  1. TCP握手
  2. HTTP握手。客户端发送一个HTTP请求,其中包含了一些特殊的头部,表明它希望升级连接到WebSocket。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
  1. HTTP101切换协议响应。如果服务器支持WebSocket并且验证客户端的请求合法,服务器会响应一个HTTP101状态码,表示切换协议。服务器的响应头可能如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  1. WebSocket握手完成。一旦客户端收到服务器101切换协议响应,WebSocket握手就完成了。此后,客户端和服务器就可以在建立的持久连接上进行全双工通信,发送和接收WebSocket帧。

(四)配置解析

map $http_upgrade $connection_upgrade {
          default upgrade;
          '' close;
} 
server {
        listen       9038;
        server_name  _;
 
 
        location / {
        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_pass http://192.168.0.210:9038;

        # 确保Nginx使用HTTP 1.1版本与后端服务器进行通信;1.1版本支持处理HTTP握手过程中的特殊头部处理
        proxy_http_version 1.1;
        # 设置代理的读取超时时间为 60 秒,即如果在 60 秒内没有从后端服务器接收到数据,代理将会中断连接。
        proxy_read_timeout 60s;
        # 将客户端的Upgrade头部传递给后端服务器。当$http_upgrade为websocket或不为空时,$connection_upgrade为upgrade;当$http_upgrade为空时,$connection_upgrade为close,根据上边的map进行映射。
        proxy_set_header Upgrade $http_upgrade;
        # 将Connection传递给后端服务器。
        proxy_set_header Connection $connection_upgrade;
        }
}

(五)问题

  1. 如何保证持久连接?
设置超时,多长时间没有活动时就认为连接已断开。且设置心跳机制,客户端定期发送特殊的帧(通常是PING帧)到服务端,确认连接的存活性。

七、跨域

server {
    listen 80;
    server_name your-domain.com;

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        index  index.html index.htm;
        root /usr/share/nginx/html;
    }
}

(一)解析

server {
    listen 80;
    server_name your-domain.com;

    location / {
        # 允许所有来源的跨域请求
        add_header 'Access-Control-Allow-Origin' '*';
        # 允许的请求方法
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        # 允许的头部信息
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        index  index.html index.htm;
        root /usr/share/nginx/html;
    }
}

(二)简介

跨域(Cross-Origin)是指在 Web 开发中,一个网页的资源请求来自于不同的域(域名、协议或端口),而不是当前页面所在的域。由于浏览器的同源策略(Same-Origin Policy),默认情况下,跨域请求是被禁止的,为了保障用户信息的安全性。

八、基于名称的虚拟主机

server_name

server {
    listen 80;
    server_name www.test1.com;
}

server {
    listen 80;
    server_name www.test2.com;
}

(一)解析

	当客户端发送请求时,Nginx会根据请求的域名和其他条件,选择匹配的 server 块来处理请求。通过设置不同的 server_name,你可以配置多个虚拟主机,每个虚拟主机处理不同的域名,从而实现域名之间的隔离。

	这种虚拟主机的隔离方式允许你在同一台服务器上托管多个域名,并为每个域名提供独立的配置和处理逻辑,而不会相互影响。这对于在一个服务器上托管多个网站或应用程序是非常常见的配置。
文章来源:https://blog.csdn.net/yuanfangPOET/article/details/135446624
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。