Nginx快速入门教程,域名转发、负载均衡
1.Nginx简介
Nginx是⽬前最流⾏的Web服务器,
最开始是由⼀个叫做igor的俄罗斯的程序员开发的,
2019年3⽉11⽇被美国的F5公司以6.7亿美元的价格收购,
现在Nginx是F5公司旗下的⼀款产品了。
2.Nginx的版本
Nginx开源版本主要分为两种,⼀种是稳定版,⼀种是主线版。
主线版(mainline):主线版是最新的版本,功能会⽐较多,会包含⼀些正在开发中的体
验性模块功能,但是也可能会有⼀些新的bug。
稳定版(Stable):稳定版是经过⻓时间测试的版本,不会有太多的bug,也不会包含⼀
些新的功能。
Nginx安装(预编译⼆进制包)
这种⽅式⽐通过源码编译安装的⽅式要简单快捷得多,只需要输⼊⼀条install命令就可以了。
不同Linux发⾏版的安装⽅式略有不同,下⾯分别介绍⼀下。
3.Nginx安装(预编译⼆进制包)
3.1 CentOS/RHEL/Oracle Linux/AlmaLinux/Rocky Linux repository.
CentOS系Linux发⾏版可以使⽤yum来安装。
也可以通过Nginx的官⽅仓库来安装,这样可以保证安装的是最新的版本。
安装前置依赖
添加nginx仓库
添加以下内容
# 1. 安装EPEL仓库sudo yum install epel-release# 2. 更新reposudo yum update# 3. 安装nginxsudo yum install nginx# 4. 验证安装sudo nginx -V
也可以通过Nginx的官⽅仓库来安装,这样可以保证安装的是最新的版本。
1. 安装前置依赖
sudo yum install yum-utils2. 添加nginx仓库
sudo vi /etc/yum.repos.d/nginx.repo3. 添加以下内容
[nginx-stable] [nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
上⾯的 stable 和 mainline 就分别表示稳定版和主线版,可以根据⾃⼰的需要来选择。4. 更新repo
sudo yum update5. 安装nginx
sudo yum install nginx6. 验证安装
除了使⽤ sudo nginx -V 之外,还可以使⽤下⾯的⽅式来验证:# 启动Nginx
sudo nginx
curl -I 127.0.0.1如果能够看到类似下⾯的输出,就表示安装成功了:
qiye@ubuntu:~$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sun, 19 Nov 2023 08:24:00 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 19 Nov 2023 03:33:38 GMT
Connection: keep-alive
ETag: "65598212-264"
Accept-Ranges: bytes
3.2 Debian/Ubuntu repository
Debian、Ubuntu系列的Linux发⾏版可以使⽤apt来安装。
# 1. 更新仓库信息
sudo apt-get update
# 2. 安装nginx
sudo apt-get install nginx
# 3. 验证安装
sudo nginx -V
同样也可以从Nginx官⽅仓库来安装。
# 1. 安装前置依赖
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archivekeyring
# 2. 导⼊官⽅Nginx签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# 3. 验证下载的⽂件中包含了正确的密钥
gpg --dry-run --quiet --no-keyring --import --import-options import-show
/usr/share/keyrings/nginx-archive-keyring.gpg
# 4. 设置稳定版或者主线版的Nginx包
# 稳定版
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \| sudo tee /etc/apt/sources.list.d/nginx.list
# 主线版
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
3.3 从源码编译安装
从源码编译安装的⽅式可以让我们⾃定义Nginx的安装⽬录、模块等,但是安装过程⽐较繁
琐,需要安装⼀些依赖库。
3.3.1 安装PCRE库
PCRE是Perl Compatible Regular Expressions的缩写,是⼀个Perl库,包括perl兼容的正则表
达式库。
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \| sudo tee /etc/apt/sources.list.d/nginx.list
# 5. 设置仓库优先级,优先使⽤Nginx官⽅仓库
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPinPriority: 900\n" \| sudo tee /etc/apt/preferences.d/99nginx
# 6. 安装nginx
sudo apt update
sudo apt install nginx
# 7. 验证安装
sudo nginx
curl -I 127.0.0.1
3.3 从源码编译安装
从源码编译安装的⽅式可以让我们⾃定义Nginx的安装⽬录、模块等,但是安装过程⽐较繁 琐,需要安装⼀些依赖库。
3.3.1 安装PCRE库
PCRE是Perl Compatible Regular Expressions的缩写,是⼀个Perl库,包括perl兼容的正则表 达式库。
wget github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-
10.42.tar.gz
tar -zxf pcre2-10.42.tar.gz
cd pcre2-10.42
./configure
make
sudo make install
3.3.2 安装zlib库
zlib是⼀个数据压缩库,⽤于Nginx的gzip模块。
wget http://zlib.net/zlib-1.2.13.tar.gz
tar -zxf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make
sudo make install
3.3.3 安装OpenSSL库
OpenSSL是⼀个强⼤的安全套接字层密码库,⽤于Nginx的SSL模块。
wget http://www.openssl.org/source/openssl-1.1.1t.tar.gz
tar -zxf openssl-1.1.1t.tar.gz
cd openssl-1.1.1t
./Configure darwin64-x86_64-cc --prefix=/usr
make
sudo make install
3.3.4 下载Nginx源码
下载主线版的Nginx源码:
wget https://nginx.org/download/nginx-1.23.4.tar.gz
tar zxf nginx-1.23.4.tar.gz
cd nginx-1.23.4
下载稳定版的Nginx源码:
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0
3.3.5 配置编译选项
编译选项可以通过 ./configure --help 来查看。 下⾯是⼀个官⽹的例⼦:
./configure
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-pcre=../pcre2-10.42
--with-zlib=../zlib-1.2.13
--with-http_ssl_module
--with-stream
--with-mail=dynamic
--add-module=/usr/build/nginx-rtmp-module
--add-dynamic-module=/usr/build/3party_module
| 参数 | 说明 |
|---|---|
| –prefix= | 指定安装目录 |
| –sbin-path= | 指定Nginx可执行文件路径 |
| –conf-path= | 指定配置文件位置 |
| –pid-path= | 指定pid文件位置 |
| –error-log-path= | 指定错误日志文件位置 |
| –http-log-path= | 指定HTTP日志文件位置 |
| –user= | 指定运行Nginx的用户 |
| –group= | 指定运行Nginx的组 |
| –with-pcre= | 指定PCRE库的位置 |
| –with-pcre-jit | 开启PCRE的JIT(Just-in-time compilation)支持 |
| –with-zlib= | 指定zlib库的位置 |
4.Nginx的配置⽂件
Nginx的配置⽂件是 nginx.conf ,⼀般位于 /etc/nginx/nginx.conf 。
可以使⽤ nginx -t 来查看配置⽂件的位置和检查配置⽂件是否正确
oot@ubuntu:/home/qiye# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4.1 配置⽂件的结构
Nginx的配置⽂件是由⼀系列的指令组成的,每个指令都是由⼀个指令名和⼀个或者多个参数 组成的。
指令和参数之间使⽤空格来分隔,指令以分号 ; 结尾,参数可以使⽤单引号或者双引号来包 裹。
配置⽂件分为以下⼏个部分:
# 全局块
worker_processes 1;events {
# events块
}
http {
# http块server {
# server块location / {
# location块}}
}
4.1.1 全局块
全局块是配置⽂件的第⼀个块,也是配置⽂件的主体部分,主要⽤来设置⼀些影响Nginx服务
器整体运⾏的配置指令,主要包括配置运⾏Nginx服务器的⽤户(组)、允许⽣成的worker
process数、进程PID存放路径、⽇志存放路径和类型以及配置⽂件引⼊等。
# 指定运⾏Nginx服务器的⽤户,只能在全局块配置
# 将user指令注释掉,或者配置成nobody的话所有⽤户都可以运⾏
# user [user] [group]
# user nobody nobody;
user nginx;
# 指定⽣成的worker进程的数量,也可使⽤⾃动模式,只能在全局块配置
worker_processes 1;
# 错误⽇志存放路径和类型
error_log /var/log/nginx/error.log warn;
# 进程PID存放路径
pid /var/run/nginx.pid;
4.1.2 events块
events {
# 指定使⽤哪种⽹络IO模型,只能在events块中进⾏配置
# use epoll
# 每个worker process允许的最⼤连接数worker_connections 1024;
}
4.1.3 http块
http块是配置⽂件的主要部分,包括http全局块和server块。
http {# nginx 可以使用include指令引入其他配置文件include /etc/nginx/mime.types;# 默认类型,如果请求的URL没有包含文件类型,会使用默认类型default_type application/octet-stream; # 默认类型# 开启高效文件传输模式sendfile on;# 连接超时时间keepalive_timeout 65;# access_log 日志存放路径和类型# 格式为:access_log <path> [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];access_log /var/log/nginx/access.log main;# 定义日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 设置sendfile最大传输片段大小,默认为0,表示不限制# sendfile_max_chunk 1m;# 每个连接的请求次数# keepalive_requests 100;# keepalive超时时间keepalive_timeout 65;# 开启gzip压缩# gzip on;# 开启gzip压缩的最小文件大小# gzip_min_length 1k;# gzip压缩级别,1-9,级别越高压缩率越高,但是消耗CPU资源也越多# gzip_comp_level 2;# gzip压缩文件类型# gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;# upstream指令用于定义一组服务器,一般用来配置反向代理和负载均衡upstream www.example.com {# ip_hash指令用于设置负载均衡的方式,ip_hash表示使用客户端的IP进行hash,# 这样可以保证同一个客户端的请求每次都会分配到同一个服务器,解决了session共享的问题ip_hash;# weight 用于设置权重,权重越高被分配到的机率越大server 192.168.50.11:80 weight=3;server 192.168.50.12:80;server 192.168.50.13:80;}server {# 参考server块的配置}
}
4.1.4 server块
server块是配置虚拟主机的,⼀个http块可以包含多个server块,每个server块就是⼀个虚拟主 机。
server {# 监听IP和端口# listen的格式为:# listen [ip]:port [default_server] [ssl] [http2] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number];# listen指令非常灵活,可以指定多个IP和端口,也可以使用通配符# 下面是几个实际的例子:# listen 127.0.0.1:80; # 监听来自127.0.0.1的80端口的请求# listen 80; # 监听来自所有IP的80端口的请求# listen *:80; # 监听来自所有IP的80端口的请求,同上# listen 127.0.0.1; # 监听来自来自127.0.0.1的80端口,默认端口为80listen 80;# server_name 用来指定虚拟主机的域名,可以使用精确匹配、通配符匹配和正则匹配等方式# server_name example.org www.example.org; # 精确匹配# server_name *.example.org; # 通配符匹配# server_name ~^www\d+\.example\.net$; # 正则匹配server_name localhost;# location块用来配置请求的路由,一个server块可以包含多个location块,每个 location块就是一个请求路由# location块的格式是:# location [=|~|~*|^~] /uri/ { ... }# = 表示精确匹配,只有完全匹配上才能生效# ~ 表示区分大小写的正则匹配# ~* 表示不区分大小写的正则匹配# ^~ 表示普通字符匹配,如果匹配成功,则不再匹配其他location# /uri/ 表示请求的URI,可以是字符串,也可以是正则表达式# { ... } 表示location块的配置内容location / {# root指令用于指定请求的根目录,可以是绝对路径,也可以是相对路径root /usr/share/nginx/html; # 根目录# index指令用于指定默认文件,如果请求的是目录,则会在目录下查找默认文件index index.html index.htm; # 默认文件}# 下面是一些location的示例:location = / { # 精确匹配请求root /usr/share/nginx/html;index index.html index.htm;}location ^~ /images/ { # 匹配以/images/开头的请求root /usr/share/nginx/html;}location ~* \.(gif|jpg|jpeg)$ { # 匹配以gif、jpg或者jpeg结尾的请求root /usr/share/nginx/html;}location !~ \.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求root /usr/share/nginx/html;}location !~* \.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求root /usr/share/nginx/html;}# error_page 用于指定错误页面,可以指定多个,按照优先级从高到低依次查找error_page 500 502 503 504 /50x.html; # 错误页面location = /50x.html {root /usr/share/nginx/html;}
}
5.Nginx的常⽤命令
nginx # 启动Nginx
nginx -c filename # 指定配置⽂件
nginx -V # 查看Nginx的版本和编译参数等信息
nginx -t # 检查配置⽂件是否正确,也可⽤来定位配置⽂件的位置
nginx -s quit # 优雅停⽌Nginx
nginx -s stop # 快速停⽌Nginx
nginx -s reload # 重新加载配置⽂件
nginx -s reopen # 重新打开⽇志⽂件
6.Nginx的常⽤模块
| 模块名(Module Name) | 描述(Description) |
|---|---|
| http_access_module | 接受或者拒绝特定的客户端请求 |
| http_auth_basic_module | HTTP基本认证,使用用户名和密码来限制对资源的访问 |
| http_autoindex_module | 自动索引,用于显示目录列表 |
| http_browser_module | 从 User-Agent 请求头中获取和识别客户端浏览器 |
| http_charset_module | 添加特定的字符集到 Content-Type 响应头中 |
| http_empty_gif_module | 返回一个1像素的透明GIF图片 |
| http_fastcgi_module | FastCGI支持 |
| http_geo_module | 从IP地址中获取地理位置信息 |
| http_gzip_module | Gzip压缩支持 |
| http_limit_conn_module | 限制并发连接数 |
| http_limit_req_module | 限制请求速率 |
| http_map_module | 从变量中获取值 |
| http_memcached_module | Memcached支持 |
| http_proxy_module | 反向代理支持 |
| http_referer_module | 防盗链 |
| http_rewrite_module | URL重写 |
| http_scgi_module | 转发请求到SCGI服务器 |
| http_ssi_module | 处理和支持SSI(Server Side Includes) |
| http_split_clients_module | 根据客户端IP地址或者其他变量将客户端分配到组中,一般用于A/B测试 |
| http_upstream_hash_module | 启用一致性哈希负载均衡 |
| http_upstream_ip_hash_module | 启用IP哈希负载均衡 |
| http_upstream_keepalive_module | 启用长连接负载均衡 |
| http_upstream_least_conn_module | 启用最少连接负载均衡 |
| http_upstream_zone_module | 启用共享内存负载均衡 |
| http_userid_module | 为客户端设置一个唯一的ID(UID、cookie) |
| http_uwsgi_module | 转发请求到uWSGI服务器,一般用于Python应用 |
7.实际运行
**1.**域名转到本地某个服务端口
把来自 xxx.com 的请求反向代理到本地的 http://127.0.0.1:8888,并且对HTTPS进行了SSL配置。
server
{listen 80;listen 443 ssl http2;server_name xxx.com;index index.html index.htm default.htm default.html;root /www/tts/azure_website;#SSL-START SSL相关配置#error_page 404/404.html;#HTTP_TO_HTTPS_STARTif ($server_port !~ 443){rewrite ^(/.*)$ https://$host$1 permanent;}#HTTP_TO_HTTPS_ENDssl_certificate /www/server/panel/vhost/cert/azure_website/fullchain.pem;ssl_certificate_key /www/server/panel/vhost/cert/azure_website/privkey.pem;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;add_header Strict-Transport-Security "max-age=31536000";error_page 497 https://$host$request_uri;#SSL-END#ERROR-PAGE-START 错误页相关配置#error_page 404 /404.html;#error_page 502 /502.html;#ERROR-PAGE-END#REWRITE-START 伪静态相关配置include /www/server/panel/vhost/rewrite/python_azure_website.conf;#REWRITE-END#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env) {return 404;}#一键申请SSL证书验证目录相关设置location /.well-known/ {root /www/wwwroot/java_node_ssl;}#禁止在证书验证目录放入敏感文件if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {return 403;}# HTTP反向代理相关配置开始 >>>location ~ /purge(/.*) {proxy_cache_purge cache_one 127.0.0.1$request_uri$is_args$args;}location / {proxy_pass http://127.0.0.1:8888;proxy_set_header Host 127.0.0.1:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;proxy_set_header X-Host $host:$server_port;proxy_set_header X-Scheme $scheme;proxy_connect_timeout 30s;proxy_read_timeout 86400s;proxy_send_timeout 30s;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}# HTTP反向代理相关配置结束 <<<access_log /www/wwwlogs/azure_website.log;error_log /www/wwwlogs/azure_website.error.log;
}
- 基础配置:
listen 80;: 监听HTTP请求的端口。listen 443 ssl http2;: 监听HTTPS请求的端口,并启用SSL和HTTP/2。server_name xxx.com;: 指定服务器的域名。index index.html index.htm default.htm default.html;: 指定默认的索引文件。root /www/tts/azure_website;: 指定网站根目录。
- SSL 配置:
- SSL证书和密钥的路径。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;: 指定SSL协议版本。ssl_ciphers ...: 指定支持的加密套件。ssl_prefer_server_ciphers on;: 优先使用服务器端的加密套件。ssl_session_cache shared:SSL:10m;: 配置SSL会话缓存。ssl_session_timeout 10m;: 配置SSL会话超时时间。add_header Strict-Transport-Security "max-age=31536000";: 启用HSTS,强制使用HTTPS。error_page 497 https://$host$request_uri;: 处理HTTP到HTTPS的重定向。
- 错误页配置:
- 错误页相关配置,包括404和502错误页。
- 伪静态相关配置:
- 引入了一个外部配置文件
python_azure_website.conf,可能包含伪静态规则。
- 引入了一个外部配置文件
- 禁止访问文件或目录:
- 禁止访问指定的敏感文件或目录。
- SSL证书验证目录相关设置:
- 设置一个目录用于一键申请SSL证书的验证。
- 反向代理配置:
- 配置了一个HTTP反向代理,将请求转发到本地的
http://127.0.0.1:8888。 - 设置了一些代理头,如
Host、X-Real-IP、X-Forwarded-For等。 - 配置了一些超时时间和版本信息。
- 使用了
proxy_cache_purge模块,允许通过/purge路径刷新缓存。
- 配置了一个HTTP反向代理,将请求转发到本地的
- 日志配置:
- 配置了访问日志和错误日志的路径。
2.负载均衡
流量转移到两个服务中
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on;
}http {### Basic Settings##sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;# server_tokens off;# server_names_hash_bucket_size 64;# server_name_in_redirect off;include /etc/nginx/mime.types;default_type application/octet-stream;### SSL Settings##ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;### Logging Settings##access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;### Gzip Settings##gzip on;# gzip_vary on;# gzip_proxied any;# gzip_comp_level 6;# gzip_buffers 16 8k;# gzip_http_version 1.1;# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;### Virtual Host Configs##include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;upstream backend {server localhost:8000;server localhost:8001;# 在实际生产环境中,你可能会有更多的后端服务器,可以根据需求添加# server 块来增加服务器数量,也可以设置权重来调整负载均衡的比例# 例如:# server localhost:8002 weight=2;}server {listen 80;server_name 192.168.31.131;location /app {proxy_pass http://backend;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_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;proxy_set_header X-Host $host:$server_port;proxy_set_header X-Scheme $scheme;proxy_connect_timeout 30s;proxy_read_timeout 86400s;proxy_send_timeout 30s;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 这里使用了upstream块中定义的负载均衡组"backend"# 请求会被均匀分发到定义的后端服务器中}# 可以根据需要添加其他 location 配置# 配置错误页面error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
}
简化版:
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream backend {server 192.168.31.131:8000;server 192.168.31.131:8001;}server {listen 80;server_name 192.168.31.131;location /app {proxy_pass http://backend;}error_page 500 502 503 504 /50x.html;location ^~ /api/ {proxy_pass http://backend/;}}}
3.配置最少连接策略
到达 Nginx 的请求会被发送往最少数量的现有活动连接的服务器。
在 upstream 中添加关键字 least_conn:
upstream crmdev {least_conn;server 192.168.101.1:8080;server 192.168.101.2:8080;
}
如果列出了多个服务器,并且有多台服务器都处于低数量连接状态,将在这些服务器中轮询。
4.配置IP 哈希策略
轮询和最少连接的不足在于来自客户端的连接会到达池中不同的服务器,这对于不依赖会话的应用程序来说还好。但是如果你的应用程序依赖,一旦与某台服务器建立了初始连接,你就想要来自那个客户端的所有连接都被转发到那台服务器。这样,IP 哈希算法就有用了:
upstream crmdev {ip_hash;server 192.168.101.1:8080;server 192.168.101.2:8080;
}
5. 单独服务器的权重选项
也可以单独指定池中的某台服务器的权重。默认所有的服务器权重相同,都为1。
upstream crmdev {server 192.168.101.1:8080;server 192.168.101.2:8080;server 192.168.101.3:8080 weight 2;server 192.168.101.4:8080;server 192.168.101.5:8080;
}
这里总共5台服务器。但是第三台服务器的权重为2,意味着每6个请求中有两个会被转发到第三台,爱其他服务器一台分配一个。在更强劲的服务器分配更多的负载更为合理。
6.超时选项
给某台服务器设置 max_fails 和 fail_timeout:
upstream crmdev {server 192.168.101.1:8080 max_fails=3 fail_timeout=30s;server 192.168.101.2:8080;server 192.168.101.3:8080 weight 2;server 192.168.101.4:8080;server 192.168.101.5:8080;
}
默认的 fail_timeout 是10秒,10秒内如果有 n 次失败的尝试,服务器将被下线,但也仅仅是下线十秒。
默认的 max_fails 是1次,配合 fail_timeout 暂时下线不可用的服务器。
7. 在服务器池中预留一台备用服务器
下面的例子中,第五台服务器被标记了 backup 关键字:
upstream crmdev {server 192.168.101.1:8080 max_fails=3 fail_timeout=30s;server 192.168.101.2:8080;server 192.168.101.3:8080 weight 2;server 192.168.101.4:8080;server 192.168.101.5:8080 backup;
}
Nginx 会暂时忽略这台服务器除非其他四台全都宕机。
相关文章:
Nginx快速入门教程,域名转发、负载均衡
1.Nginx简介 Nginx是⽬前最流⾏的Web服务器, 最开始是由⼀个叫做igor的俄罗斯的程序员开发的, 2019年3⽉11⽇被美国的F5公司以6.7亿美元的价格收购, 现在Nginx是F5公司旗下的⼀款产品了。 2.Nginx的版本 Nginx开源版本主要分为两种&#x…...
ElasticSearch之健康状态
参考Cluster health API。 命令样例,如下: curl -X GET "https://localhost:9200/_cluster/health?wait_for_statusyellow&timeout50s&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9&qu…...
java io流中为什么使用缓冲流就能加快文件读写速度
FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…...
【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World
下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...
求二叉树中指定节点所在的层数(可运行)
运行环境.cpp 我这里设置的是查字符e的层数,大家可以在main函数里改成自己想查的字符。(输入的字符一定是自己树里有的)。 如果没有输出结果,一定是建树错误!!!!!&…...
Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、移植
Opencv3.*主模块默认包括两个3D库 calib3d用于相机校准和三维重建 ,viz用于三维图像显示,其中viz是cmake选配。 参考: https://docs.opencv.org/3.4.12/index.html 下载linux版本的源码 sources。 查看cmake apt list --installed | grep…...
EPSon打印机更换色带
1、打印机色带拆装视频 打印机色带更换 2、色带盒四周有多个卡扣,需从右到左依次轻微用力掰开,使盖板与盒体脱离,注意不要掰断卡扣。 3、如何将色带放入打印机色带盒? A、色带放入盒体时不可打乱打结,以免卡带&#x…...
电脑游戏录屏软件,记录游戏高光时刻
电脑游戏录制是游戏爱好者分享游戏乐趣、技巧和成就的绝佳方式,此时,一款好用的录屏软件就显得尤为重要。本文将为大家介绍三款电脑游戏录屏软件,通过对这三款软件的分步骤详细介绍,让大家更加了解它们的特点及使用方法。 电脑游戏…...
Hadoop性能调优建议
一、服务器配置 1. BIOS配置: 关闭smmu/关闭cpu预取/performance策略 2. 硬盘优化 raid0 打卡cache /jbod scheduler/sector_size/read_ahead_kb 3. 网卡优化 rx_buff/ring_buffer/lro/中断绑核/驱动升级 4. 内存插法:要用均衡插法…...
算法的奥秘:常见的六种算法(算法导论笔记2)
算法的奥秘:种类、特性及应用详解(算法导论笔记1) 上期总结算法的种类和大致介绍,这一期主要讲常见的六种算法详解以及演示。 排序算法: 排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复…...
Python算法——树的路径和算法
Python算法——树的路径和算法 树的路径和算法是一种在树结构中寻找从根节点到叶节点的所有路径,其路径上的节点值之和等于给定目标值的算法。这种算法可以用Python语言实现,本文将介绍如何使用Python编写树的路径和算法,并给出一些示例代码…...
数据结构之链表练习与习题详细解析
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.习题解…...
QT中使用unity
qt把unity发入widget中 头文件showunitywindowsinqt #ifndef SHOWUNITYWINDOWSINQT_H #define SHOWUNITYWINDOWSINQT_H #include <QObject> #include <QProcess> #include <windows.h> #include <winuser.h> #include <QDebug> class ShowUnity…...
QTableView/QTableWidget设置单元格字体颜色及背景色
1.QTableView设置单元格字体颜色及背景色 QStandardItem * pItem new QStandardItem("AAA"); pItem->setBackground(QBrush(Qt::blue)); // 设置背景色 pItem->setForeground(QBrush(Qt::red)); // 设置字体颜色 2.QTableWidget设置单元格字…...
电脑上可以写便签的软件哪些界面比较可爱且好用?
电脑上可以安装使用的便签类软件比较多,在选择使用电脑便签软件时,很多人对便签的外观界面还是比较在意的,一个好看的便签界面在一方面可以引起大家的注意,另一方面可以增加电脑桌面背景和便签类软件的协调性。 电脑便签软件通常…...
2021秋招-总目录
2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function࿱…...
HTML5生成二维码
H5生成二维码 前言二维码实现过程页面实现关键点全部源码 前言 本文主要讲解如何通过原生HTML、CSS、Js中的qrcodejs二维码生成库,实现一个输入URL按下回车后输出URL。文章底部有全部源码,需要可以自取。 实现效果图: 上述实现效果为&#…...
大数据-之LibrA数据库系统告警处理(ALM-25005 Nscd服务异常)
告警解释 系统每60秒周期性检测nscd服务的状态,如果连续4次(3分钟)查询不到nscd进程或者无法获取ldapserver中的用户时,产生该告警。 当进程恢复且可以获取ldapserver中的用户时,告警恢复。 告警属性 告警ID 告警级…...
NLP:使用 SciKit Learn 的文本矢量化方法
一、说明 本文是使用所有 SciKit Learns 预处理方法生成文本数字表示的深入解释和教程。对于以下每个矢量化器,将给出一个简短的定义和实际示例:one-hot、count、dict、TfIdf 和哈希矢量化器。 SciKit Learn 是一个用于机器学习项目的广泛库,…...
这些仪表板常用的数据分析模型,你都见过吗?
本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 ##前言 在数字化时代,数据已经成为了企业决策和管理的重要依据。而仪表板作为一种数据可视化工具&#x…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
