nginx
【0】README
本文po处理 nginx的主要内容,包括反向代理,负载均衡,动静分离,高可用集群等;
本文引用链接:
vmware安装centos8,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119510351 ;
centos8安装 nginx,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
centos安装 tomcat9, refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;
【1】介绍
【1.1】基本概念
1)nginx是什么,做什么事情;
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。
能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
[服务器]
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
无缓存的反向代理加速,简单的负载均衡和容错。
FastCGI,简单的负载均衡和容错。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
2)反向代理
2.1)正向代理
正向代理服务器扮演的是客户端角色,是位于客户端和目标服务器之间的代理服务器(中间服务器),需要在本地配置要访问的目标服务器。
为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。
正向代理的情况下客户端必须要进行一些特别的设置才能使用 。
2.2)反向代理
反向代理服务器扮演的是服务器角色,因此客户端不需要进行任何设置,因为代理配置在反向代理服务器中配置。。
客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务。
2.3)正向代理与反向代理的区别
- 区别1:正向代理中,代理服务器作为客户端的代理,反向代理中,代理服务器是服务端的代理(干货——这句真的是说清楚了正向代理与反向代理的区别);
- 区别2:正向代理一般是客户端架设的,比如本地安装一个代理软件(翻墙软件就是典型的正向代理的例子)。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器 ( 前后端统一域名就是反向代理的例子) 。
- 区别3:正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
- 区别4:正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度;
- 区别5:正向代理中,浏览器与代理服务器在同一个LAN 局域网中;而反向代理中,代理服务器与目标服务器在同一个LAN ;
3)负载均衡;
定义: 单个服务器无法满足访问请求,我们增加服务器数量,然后将请求分发到各个服务器上。即将原先请求集中到单个服务器上的情况改为 发送到多个服务器上,即把负载或访问压力分发到不同服务器,具体是哪台服务器由 负载均衡器根据给定策略来选择 ; 这种把请求负载分发到多个服务器的请求转发策略,称为负载均衡;
4)动静分离
为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;
动静分离部署图:
但现在 servlet,jsp用的比较少了,所以应用场景不多;
【1.2】nginx安装,常用命令和配置文件
1)在linux系统中安装nginx
参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
2)nginx常用命令
安装完成后,nginx 命令在
[root@localhost sbin]# which nginx
/usr/sbin/nginx
参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
3)nginx配置文件
安装完成后,nginx配置文件在 /etc/nginx/nginx.conf 下面;
3.0)nginx.conf 配置文件由3部分组成;
3.1)部分1:全局块;
从开始到events 块之间的内容,主要设置 nginx运行的配置指令;
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
worker_process auto或1 ; 表示支持的并发请求;
3.2)部分2:events块;
主要是配置nginx服务器与用户网络连接;
events {
worker_connections 1024;
}
worker_connections 表示每个worker进程支持的最大连接数是多少;
3.3)部分3:http块;
配置了 代理,缓存和日志定义等; http块下面包括 http全局块, server块 ;
3.3.1)http全局块
配置的指令包括 文件引入, MIME-TYPE定义,日志定义,连接超时时间 等;
媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
3.3.2)server块
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
1个server块就是一个虚拟主机;1个http可以包含多个server块;
每个server块分为全局server, 也可以通过包含多个location块;
【2】nginx配置实例1-反向代理
1)实现效果
浏览器输入地址 www.123.com ; 直接跳转到 tomcat主页面;
2)步骤
step1) 启动tomcat
安装并启动tomcat 参见 https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;
firewall-cmd --zone=public --add-port=8080/tcp --permanent 开放8080端口被访问
firewall-cmd --reload 重启防火墙
step2) 通过nginx 配置反向代理策略
step3) 配置 host
添加 www.abc.com 的ip地址映射 ,如下:
192.168.163.204 www.abc.com
step4) 添加nginx反向代理配置
server {
listen 80;
server_name 192.168.163.204;
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080;
}
}
效果如下: 访问www.abc.com , 被代理到 tomcat首页, 即127.0.0.1:080 d端口
【3】nginx配置实例2-反向代理
1)实现效果
使用nginx反向代理,根据访问路径的不同代理到请求不同端口;
如 nginx监听端口 9001
访问 www.abc.com/test01 直接跳转到 http://192.168.163.204:8080/test01/index01.html
访问 www.abc.com/test02 直接跳转到 http://192.168.163.204:8080/test02/index02.html
2)步骤
step1)配置tomcat测试页面
step2)配置nginx反向代理
server {
listen 80;
server_name 192.168.163.204;
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080;
}
location /test01 {
proxy_pass http://127.0.0.1:8080/test01/;
}
location /test02 {
proxy_pass http://127.0.0.1:8080/test02/;
}
}
补充: 反向代理proxy_pass绝对路径与相对路径
注意 https://www.jianshu.com/p/ec14f55fd209 , nginx反向代理proxy_pass绝对路径和相对路径 ;
- 绝对路径: 127.0.0.1:8080/test01/ 后面带了斜杠,就是 绝对路径 ; 绝对路径会把 location中的 /test01 给删除掉;
- 相对路径: 127.0.0.1:8080/test01 后面不带斜杠,就是 相对路径; 相对路径会把 location中的 /test01 也作为请求路径一部分传给服务器;
step3)反向代理设置访问成功
补充2: 详解Nginx location 匹配规则
https://blog.csdn.net/bigtree_3721/article/details/106105924
【4】nginx配置实例2-负载均衡
1)负载均衡定义
通过增加服务器数量,把请求负载分发到各个服务器上,以减少单个服务器访问压力的访问模型;
2)实现效果
访问 http://www.abc.com/test01/index01.html , nginx 把请求分发到 192.168.163.201 和 192.168.163.204 ;
3)步骤
step1)负载均衡配置
在http 块中添加 upstream块,并取名为 myserver;
在 location块中设置 反向道理到myserver;
http {
# load balance config
upstream myserver {
server 192.168.163.201:8080;
server 192.168.163.204:8080;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 192.168.163.204;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
location /test01 {
proxy_pass http://myserver/test01/;
}
location /test02 {
proxy_pass http://myserver/test02/;
}
}
}
step2)执行效果
(请求被平均分发到 centos201 centos204 服务器)
3)负载均衡分发策略
策略1:轮询(默认*)
按照请求时间先后顺序分配到不同的后端服务器;如果后端服务器down掉,则自动剔除;
策略2:weight 权值 (默认值为1)
upstream myserver {
server 192.168.163.201:8080 weight=10;
server 192.168.163.204:8080 weight=20;
}
策略3:ip hash方式(散列分发)
每个请求按照访问 ip 的hash结果进行分配,这样每个访客在同一个ip都会被分发到固定的服务器 ;
upstream myserver {
ip_hash;
server 192.168.163.201:8080;
server 192.168.163.204:8080;
}
策略4: fair 公平分发
按照后端服务器的响应时间来分配,响应时间越短,则优先分配;
upstream myserver {
fair;
server 192.168.163.201:8080;
server 192.168.163.204:8080;
}
补充: fair是第三方模块,需要重新安装 依赖包;
【5】ngxinx配置实例-动静分离
1)动静分离定义
为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;
更直白点: nginx处理静态资源, tomcat处理动态资源 ;
2)动静分离实现策略(两种策略)
策略1: 把静态资源单独放在独立服务器上,主流推崇的方式;
策略2: 动态与静态文件混合放在一起发布在同一台服务器上,通过nginx来分开 ;
通过location 指定不同的后缀名实现不同的请求转发; 通过expires 参数设置, 可以让浏览器缓存过期时间 ,减少与服务器之间的请求和流量;
策略3:expires缓存静态资源例子
若设置 expires为3d(3天),表示在3天内访问某个静态资源的请求, 若比对服务器该文件的最后修改时间没有变化,则不会从服务器抓取,返回304状态码,让浏览器从本地获取资源; 若发送了变化,则服务器重新从发送资源到 浏览器,状态码200;
3)步骤
step1)nginx静态资源
step2)nginx配置访问静态资源
nginx静态资源准备及访问 https://blog.csdn.net/PacosonSWJTU/article/details/119505771
【6】nginx配置高可用集群
1)高可用定义
若nginx是单个接口,则当nginx宕机了,请求无法顺利进行;
若是高可用,则启动一台服务器节点宕机了,服务还是可以正常访问;
1.1)高可用集群架构
1.2)高可用环境准备
step1)需要两台nginx 服务器;
安装nginx, https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
安装tomcat, https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;
step2)需要keepalived ;
两台机器都要装 keepalived ;
yum -y install keepalived ;
rpm -q -a keepalived 查看是否安装成功;
[root@centos205 nginx]# rpm -q -a keepalived
keepalived-2.1.5-6.el8.x86_64
其配置文件在 /etc/keepalived/ 目录 下;
[root@centos205 nginx]# cd /etc/keepalived/
[root@centos205 keepalived]# pwd
/etc/keepalived
[root@centos205 keepalived]# ll
总用量 4
-rw-r--r--. 1 root root 3550 1月 27 2021 keepalived.conf
2)高可用集群配置
step1) 修改keepalived配置
/etc/keepalived/keepalived.conf
centos204 MASTER
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.163.204
smtp_connect_timeout 30
router_id LVS_DEVEL # /etc/hosts 添加 127.0.0.1 LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/script/nginx/nginx_check.sh"
interval 2 # 检测脚本执行间隔时间
weight 2
}
vrrp_instance VI_1 {
state MASTER # MASTER OR BACKUP
interface ens160
virtual_router_id 51 # 主从机器的virtual_route_id 必须相同
priority 100 # 主从机器的优先级,主机值较大, 从机较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.200 # 虚拟ip地址 主从机器配置相同
}
}
centos205 SLAVE
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.163.204
smtp_connect_timeout 30
router_id LVS_DEVEL # /etc/hosts 添加 127.0.0.1 LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/script/nginx/nginx_check.sh"
interval 2 # 检测脚本执行间隔时间
weight 2
}
vrrp_instance VI_1 {
state BACKUP # MASTER OR BACKUP
interface ens160 # 网卡 ifconfig 查看
virtual_router_id 51 # 主从机器的virtual_route_id 必须相同
priority 90 # 主从机器的优先级,主机值较大, 从机较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.200 # 虚拟ip地址 主从机器配置相同
}
}
/usr/script/nginx/nginx_check.sh 检测master是否存活的脚本;
#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [ $A -eq 0 ]; then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
killall keepalived
fi
fi
step2)启动两台服务器的 nginx 和 keepalived
- 启动nginx: nginx;
- 启动keepalived: systemctl start keepalived.service
- 停止nginx: nginx -s stop;
- 停止 keepalived: systemctl stop keepalived.service
3)执行效果
3.1)访问虚拟ip 192.168.163.200
http://192.168.163.200/www2/home.html 可用;
3.2)停用 centos205机器的 nginx 和 keepalived;
[root@centos205 keepalived]# nginx -s stop
[root@centos205 keepalived]# systemctl stop keepalived.service
3.3)再次访问虚拟ip 192.168.163.200成功
再次访问 192.168.163.200 成功,因为 centos205 宕机,当因为centos204 , centos205 属于高可用集群,所以centos204继续提供服务;
【7】nginx小结
1)1个master和多个worker进程好处
好处1: 可以使用 nginx-s reload 热部署;
好处2: 每个worker 是独立的进程,如果有其中一个worker 出现问题,其他worker是独立的,会继续进行争抢,实现请求过程,不会造成服务中断;
2)设置多少个worker进程合适
worker进程数量与cpu核数相等是最为合适的;
worker_processes 4; // nginx.conf 中进行配置
3)连接数 worker_connection
问题1: 发送一个请求,占用了worker进程的几个连接数 ? 2个 ;
客户端请求nginx (第1个连接), nginx请求tomcat(第2个连接) ;
问题2: nginx中有1个 master,4个worker进程; 每个worker进程 支持的最大连接数是 1024 ; 那worker支持的最大并发数是多少?4*1024/2 = 2k ;
// nginx.conf 中的events 块中设置
events {
worker_connections 1024; # 每个worker进程的最大连接数
}