文章目录
一、简介
ginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
通常我们会使用 Nginx 实现 反向代理、负载均胜、动静结合、高可用。
二、Docker 安转 Nginx
下载并安装:
docker run --name nginx-test -p 80:80 -d nginx
查看进程:
docker ps
你也可以选择挂载文件。或者通过 docker inspect 容器ID 直接找到 docker 容器中的目录在linux的中的物理位置—— "GraphDriver" 下的 "MergedDir"
挂载:
docker run --name nginx --restart=always -p 80:80 \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/logs:/var/log/nginx \
-d nginx:latest
docker容器对应的物理位置: 使用 docker inspect tomcat-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录
三、反向代理
1、介绍
所谓的 反向代理 就是客户端在访问目标服务器是不是直接访问,而是需要通过一个中间服务器(Nginx)进行转发请求到真实的服务器。在这个过程中,中间服务器(Nginx)与目标服务器对于客户端而言是一个整体,因为在客户端的角度而言只是中间服务器(Nginx)是对其暴露的。
2、实操
我们的目标是使用客户端访问 www.bidea.com 访问 tomcat 。
步骤一
1、安装创建 tomcat 容器 docker run -d --name tomcat-test -p 8080:8080 tomcat:jdk8
2、使用 docker inspect tomcat-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录
3、进入webapps cd /usr/local/tomcat/webapps
4、创建ROOT目录 mkdir ROOT, 创建 index.html
步骤二
1、安装创建 nginx 容器 docker run --name nginx-test -p 80:80 -d nginx
2、使用 docker inspect nginx-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录
3、进入nginx cd /etc/nginx
4、配置 nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
server {
listen 80; # nginx 所在的 Linux 的 Port
server_name 192.168.174.134; # nginx 所在的 Linux 的 IP
location / { # 当访问 192.168.174.134:80 或 192.168.174.134 时,转发到http://192.168.174.134:8080
proxy_pass http://192.168.174.134:8080;
root html;
index index.html index.htm;
}
}
include /etc/nginx/conf.d/*.conf;
}
步骤三
配置 Windows 的 host 文件,配置 www.bidea.com 192.168.174.134
添加: 192.168.174.134 www.bidea.com
访问: http://www.bidea.com/
四、负载均胜
1、介绍
负载均衡作用的目标是集群服务,当并发量很大时一台服务器无法支撑需求,此时我们就要使用集群来应付,但是集群带来了一个问题是我们应该如何保证整个集群被充分应用,此时我们就要使用 Nginx 的负载均衡。
2、负载均衡的策略
策略一:轮询(默认)
每一个请求按照时间顺序逐一分配到不同的后端服务,如果后端服务宕机,nginx 可以自动删除。
策略二:weight
weight 代表权重默认为1,权重越高被分配的客户端越多。
例如:
upstream myserver { # 设置参与负载均衡的服务组
server 192.168.174.134:8080 weight=10;
server 192.168.174.134:8081 weight=15;
}
策略三:ip_hash
每一个请求按照访问 IP 的 Hash 结果分配,这样每一个访客固定访问一个后端服务器。这样方式很适合在自己写的项目(Tomcat)上使用,这样可以避免服务器之间 Session 的传递。
例如:
upstream myserver { # 设置参与负载均衡的服务组
ip_hash; ###
server 192.168.174.134:8080;
server 192.168.174.134:8081;
}
策略四:fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
例如:
upstream myserver { # 设置参与负载均衡的服务组
fair; ###
server 192.168.174.134:8080;
server 192.168.174.134:8081;
}
3、实操
步骤一
配置两个 tomcat (上面有例子)
步骤二
1、安装创建 nginx 容器 docker run --name nginx-test -p 80:80 -d nginx
2、使用 docker inspect nginx-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录
3、进入nginx cd /etc/nginx
4、配置 nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
upstream myserver { # 设置参与负载均衡的服务组
server 192.168.174.134:8080;
server 192.168.174.134:8081;
}
server {
listen 80; # nginx 所在的 Linux 的 Port
server_name 192.168.174.134; # nginx 所在的 Linux 的 IP
location / {
proxy_pass http://myserver; # myserver为参与负载均衡的服务组的名称(自定义)
root html;
index index.html index.htm;
}
}
include /etc/nginx/conf.d/*.conf;
}
步骤三
多次访问 http://www.bidea.com/
五、动静分离
1、介绍
我们可以通过配置 Nginx 的配置,实现客户端访问linux的静态资源。
Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是简单的把动态页面和静态页面物理分开,严格意义上说应该是动态请求根静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。
动静分页从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开(我在这里不演示这种)。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 192.168.174.134;
# 访问 192.168.174.134/www 会转发到 192.168.174.134/usr/data/www
location /www/ {
root /usr/data/;
autoindex auto;
}
# 访问 192.168.174.134/images 会转发到 192.168.174.134/usr/data/images
location /images/ {
root /usr/data/;
autoindex on;
}
}
include /etc/nginx/conf.d/*.conf;
}
六、高可用(Nginx + Keepalived)
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
基本思想就是通过,我们通过 keepalived 来监控 Nginx 主机的存活情况。当 MASTER 主机宕机之后,keepalived 保证备用机(BACKUP)承担起 MASTER 的职责。
上述过程的实现的关键是要依靠两个配置文件,第一个:分别在三个 linux 中的 /etc/keepalived 目录下,建立 check_nginx.sh 文件。并添加执行权限:chmod +x check_nginx.sh(这里不需要,因为是root权限下,保险起见还是贴出来了)。check_nginx.sh 脚本文件,是用来检查 niginx 是否启动的。第二个:分别修改三个 linux 中的 /etc/keepalived 目录下的 keepalived.conf 文件(注意区分 master 和 backup),Keepalived将会依赖这个文件实现高可用。
check_nginx.sh:
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ] #用于查看当前nginx运行状况
then
systemctl start nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
kill keepalived
fi
fi
keepalived.conf(MASTER):
global_defs {
router_id LVS_DEVEL #节点名,一般使用默认的就可以
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径
interval 2 #运行脚本的间隔时间
weight -20 #变更的权重
}
vrrp_instance VI_1 {
state MASTER #此节点为MASTER,如果此节点down掉,再重启时,会立即抢占回主节点
# mcast_src_ip 172.17.0.2 本机ip,不声明则默认绑定本机ip
interface eth0 #绑定的网卡,可以通过ifconfig查看网卡信息
virtual_router_id 70 #虚拟路由标识,同一组的必须相同
priority 100 #权重
nopreempt #定义为非抢占式,因为多次主备切换对请求量大的服务器不太好
advert_int 1 #与组内其他节点发送心跳的间隔:s
virtual_ipaddress { #绑定的虚拟ip组
172.17.0.200
}
track_script { #执行前面声明的脚本
chk_nginx
}
}
keepalived.conf(BACKUP):
global_defs {
router_id LVS_DEVEL #节点名,一般使用默认的就可以
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径
interval 2 #运行脚本的间隔时间
weight -20 #变更的权重
}
vrrp_instance VI_1 {
state BACKUP #此节点为backup
# mcast_src_ip 172.17.0.3 本机ip,不声明则默认绑定本机ip
interface eth0 #绑定的网卡,可以通过ifconfig查看网卡信息
virtual_router_id 70 #虚拟路由标识,同一组的必须相同
priority 90 #权重,备节点的权重要比主节点小
advert_int 1 #与组内其他节点发送心跳的间隔:s。组内间隔必须相同
virtual_ipaddress { #绑定的虚拟ip组
172.17.0.200
}
track_script { #执行前面声明的脚本
chk_nginx
}
}