Nginx常用功能
2024-01-08 04:49:10
文章目录
一、 静态资源服务
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中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
(三)原理
- TCP握手
- HTTP握手。客户端发送一个HTTP请求,其中包含了一些特殊的头部,表明它希望升级连接到WebSocket。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
- HTTP101切换协议响应。如果服务器支持WebSocket并且验证客户端的请求合法,服务器会响应一个HTTP101状态码,表示切换协议。服务器的响应头可能如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 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;
}
}
(五)问题
- 如何保证持久连接?
设置超时,多长时间没有活动时就认为连接已断开。且设置心跳机制,客户端定期发送特殊的帧(通常是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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!