目录
- 一、安装Nginx
- 二、Nginx的反向代理
- 1、反向代理
- 2、基于Nginx实现反向代理
- 三、Nginx负载均衡策略
- 1、轮询方式
- 2、权重方式
- 3、ip_hash哈希算法方式
- 四、Nginx资源动静分离
- 五、Nginx集群
一、安装Nginx
1、安装Nginx
# 使用docker-compose安装
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
docker-compose up -d #安装启动
curl http://localhost:80 #验证访问
2、修改Nginx配置文件(nginx的核心配置文件Nginx.conf)
#全局块
worker_processes 1; #值越大,Nginx的并发能力越强
error_log /var/log/nginx/error.log warn #代表Nginx的错误日志存放路径
pid /var/run/nginx.pid;
#event块
events {
worker_connections 1024; #值越大,Nginx的并发能力越强
}
# Nginx并发能力公式:
# worker_processes * worker_connections /4|2=Nginx最终的并发能力
# 动态资源需要/4 静态资源需要/2
# Nginx通过动静分离,来提升Nginx的并发能力
#http块
http{
include /etc/nginx/mime.types; #代表引入一个外部的文件,->/mime.types中放着大量的媒体类型
#include /etc/nginx/conf.d/*.conf->引入conf.d目录下以conf结尾的文件
default_type application/otcet-stream;
server{
listen 80; 代表nginx监听的端口
server_name localhost; 代表Nginx接受请求的ip
location / {
root /usr/share/nginx/html #将接收到的请求根据/usr/share/nginx/html/下查找静态资源
index index.html index/htm #默认去上述路径中找到index.html或index.htm
}
}
}
3、修改docker-compose.yml文件
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d #将docker容器中/etc/nginx/conf.d挂载在主机/opt/docker_nginx/conf.d/文件夹上
4、启动测试
docker-compose up -d
curl localhost:80 #访问到index.html文件
二、Nginx的反向代理
1、反向代理
1、反向代理服务器都是配置在服务端的
2、客户端不知道访问的是哪一台服务器
3、负载均衡,通过反向代理服务器来优化网站的负载
2、基于Nginx实现反向代理
启动之前的tomcat服务器
编写nginx的配置文件,通过nginx访问到tomcat服务器
server{
listen 80;
server_name localhost;
#基于反向代理访问到Tomcat服务器
location / {
proxy_pass http://192.168.112.114:8080/
}
}
通过访问 localhost:80 直接映射到 http://192.168.112.114:8080/
#1 =匹配
localhost = / {
#精确匹配,主机名后面不能带任何的字符串 localhost:80/
}
#2 通用匹配
localhoat /xxx{
#匹配所有以/xxx开头的路径 localhost:80/xxx/xxx
}
#3 正则匹配
localhost ~ /xxx{
#匹配所有以xxx开头的路径 localhost:80/xxx/xxx
}
#4 匹配开头路径
localhost ^~ /images/{
#匹配所有以/images/开头的路径 localhost:80/images/xx.jpg
}
#5 ~* \.(gif|jpg|png)$
localhost ~* \.(gif|jpg|png)$ {
#匹配以gif或者jpg或者png结尾的路径
}
三、Nginx负载均衡策略
Nginx为我们默认提供了三种负载均衡策略
1、轮询:
将客户端发起的请求,平均的分配给每一台服务器
2、权重:
会将客户端的请求,根据服务器的权重不同,分配不同的数量
3、ip_hash:
基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上
1、轮询方式
upstream app{ #定义一组服务器
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
server{
listen 80;
server_name localhost;
localhost / {
proxy_pass http://app/; #上面定义的upstream名字
}
}
2、权重方式
upstream app{ #定义一组服务器
server 192.168.0.1:8080 weight=10; #权重比例
server 192.168.0.2:8080 weight=2;#权重比例
}
server{
listen 80;
server_name localhost;
localhost / {
proxy_pass http://app/; #上面定义的upstream名字
}
}
3、ip_hash哈希算法方式
upstream app{ #定义一组服务器
ip_hash; #定义ip_hash的方式负载均衡
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
server{
listen 80;
server_name localhost;
localhost / {
proxy_pass http://app/; #上面定义的upstream名字
}
}
四、Nginx资源动静分离
1、动态资源代理
localhost / {
proxy_pass 路径;
}
2、静态资源代理
localhost / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on; # 代表展示静态资源的全部内容,/后面不填内容则以列表的形式展开
}
# 先修改docker,添加一个数据接,映射到nginx服务器的一个目录
# 添加了index.html和1.jpg静态资源
# 修改配置文件
docker-compose.yml文件
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_nginx/conf.d:/etc/nginx/conf.d
- /opt/docker_nginx/img/:/data/img
- /opt/docker_nginx/html/:/data/html
nginx.conf文件
server{
listen 80;
server_name localhost;
#代理到html静态资源
localhost /html{
root /data;
index index.html;
}
#代理到img静态资源
localhost /img{
root /data;
autoindex on;
}
}
五、Nginx集群
单点故障,避免nginx宕机,导致整个程序的崩溃
准备多台Nginx
准备keepalived,监听nginx的健康状况
准备haproxy,提供一个VIP的路径,统一的去接收用户的请求
1、dockerfile
FROM nginx:1.13.5-alpine
RUN apk update && apk upgrade
RUN apk add --no-cache bash curl ipvsadm iproute2 openrc keepalived
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
CMD ["/entrypoint.sh"]
2、entrypoint.sh
/usr/sbin/keepalived -D -f /etc/keepalived/keepalived.conf
nginx -g "daemon off;"
3、docker-compose.yml
version: "3.1"
services:
nginx_master:
build:
context: ./
dockerfile: ./Dockerfile
ports:
- 8081:80
volumes:
- ./index-master.html:/usr/share/nginx/html/index.html
- ./faviocon.ico:/usr/share/nginx/html/favicon.ico
- ./keepalived-master.conf:/etc/keepalived/keepalived.conf
networks:
static-network:
ipv4_address: 192.168.0.2
cap_add:
- NET_ADMIN
nginx_slave:
build:
context: ./
dockerfile: ./Dockerfile
ports:
- 8082:80
vloumes:
- ./index-master.html:/usr/share/nginx/html/index.html
- ./faviocon.ico:/usr/share/nginx/html/favicon.ico
- ./keepalived-master.conf:/etc/keepalived/keepalived.conf
networks:
static-network:
ipv4_address: 192.168.0.3
cap_add:
- NET_ADMIN
proxy:
image: haproxy:1.7-alpine
ports:
- 80:6371
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
network:
- static-network
networks:
static-network:
ipam:
config:
- subnet: 192.168.0.0/16
4、keepalived配置 master节点
vrrp_script chk_nginx{
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
state MASTER #定义为主服务器
interface eth0 #docker容器内部的网卡名称,承载漂移ip的网卡
virtual_router_id 77 #定义一个热备组,可以认为这是77号热备组
priority 200 #优先级
advert_int 1 #1秒互通一次,检查对方是否还在
authentication {
auth_type PASS #认证类型
auth_pass letmein #认证密码,相当于安好
}
virtual_ipaddress {
192.168.0.1 #漂移ip
}
track_script{
chk_nginx
}
}
5、keepalived配置 slave节点
vrrp_script chk_nginx{
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 #docker容器内部的网卡名称
virtual_router_id 77
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass letmein
}
virtual_ipaddress {
192.168.0.1
}
track_script{
chk_nginx
}
}
6、haproxy
global
log 127.0.0.1 local0
maxconn 4096
daemon
nbproc 4
defaults
log 127.0.0.1 local3
mode http
option dontlognull
option redispath
retries 2
maxconn 2000
balance roundrobin
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
frontend main
bind *:6301
default_backend webserver
backend webserver
server nginx_master 192.168.0.1:80 check inter 2000 rise 2 fall 5