nginx 学习积累(参考自尚硅谷nginx)

安装 nginx

centos7 直接安装是找不到的

EPEL 仓库中有 Nginx 的安装包。

sudo yum install epel-release 
# 安装 nginx
yum install nginx -y
# 开机自启动
systemctl enable nginx

nginx 常见命令

# 查看版本号
nginx -v # 这里的 版本是 nginx version: nginx/1.16.1
# 启动 nginx
nginx
# 查看 nginx 进程
ps -ef | grep nginx
# 关闭
nginx -s stop
# 重新加载
nginx -s reload

nginx 配置文件位置

nginx.conf

分为三部分:

  1. 全局块

    从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令

    比如说 worker_processes 1; worker_processes 值越大,可以支持的并发处理量就越多

  2. event块

    event块涉及的指令主要影响Nginx服务器与用户的网路连接

    比如 worker_connections 1024; 支持的最大连接数

  3. http块

    Nginx服务器中配置最频繁的部分

    http块也可以包括http全局块,server块

基础案例

反向代理

1.linux安装 tomcat

把 tomcat 安装包传到 /usr/local 路径下

cd /usr/local
# 解压
tar -zxvf apache-tomcat-7.0.107.tar.gz
cd apache-tomcat-7.0.107/bin
chmod 777 start.sh
./start.sh
# 这里可能会报错 JAVA_HOME 找不到 
# 安装 java 环境
# 把 jdk 的包也放到 /usr/local 路径下
tar -zxvf  jdk-8u211-linux-x64.tar.gz
vi ~/.bashrc

# 加上下面的内容
export JAVA_HOME=/usr/local/jdk1.8.0_211  # 改成自己的jdk路径
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 

export PATH=${JAVA_HOME}/bin:$PATH

# 让配置生效
source ~/.bashrc
# 检查
java -version
# 重新进入 tomcat的 bin 文件夹下启动
./start.sh
# 进入到 日志的存放文件夹
cd ../logs  
# 查看 tomcat 启动日志
tail -f catalina.out

关闭防火墙

# 查看防火墙状态 
firewall-cmd --state
# 停止
systemctl stop firewalld.service
# 禁止开机启动
systemctl disable firewalld.service

访问 ip:8080 ,如果能看到 那只 tomcat 猫就说明启动成功了

在 nginx 进行请求转发的配置(反向代理的配置)

server {
        listen       80;
        server_name  192.168.x.x;

        location / {
		proxy_pass http://127.0.0.1:8080;
        }
    }

访问我们的 ip (默认80)就可以看到我们可爱的 tom 猫(8080)了

反向代理2

实现的效果:

使用nginx反向代理,根据访问得路径跳转到不同的服务中

nginx监听的端口是81

访问 http://192.168.x.x:81/zzz直接跳转到192.168.x.x:9001

访问 http://127.0.0.1:81/yyy直接跳转到192.168.x.x:9002

  1. 启动两个 tomcat
# 这里使用 tomcat 的 docker 镜像 添加文件映射到 webapps 里面 
docker run -p 9001:8080 -v /usr/local/src/tom1:/usr/local/tomcat/webapps --name tom1 -d tomcat:8
docker run -p 9002:8080 -v /usr/local/src/tom2:/usr/local/tomcat/webapps --name tom2 -d tomcat:8
# 在 /usr/local/src/tom1 创建文件夹 zzz 里面新建一个 index.html
cd /usr/local/src
mkdir tom1/zzz
vi index.html

# 文本编辑器的内容
<h1>hello, 9001</h1>

# :wq 保存退出
# 同样的 在 /usr/local/src/tom2 创建文件夹 yyy 里面新建一个 index.html
cd /usr/local/src
mkdir tom2/yyy
vi index.html

<h1>hello, 9002</h1>

测试访问 ip:9001/zzz ip:9002/yyy

2.nginx添加反向代理

# another virtual host using mix of IP-, name-, and port-based configuration
server {
    listen       82;
    server_name  192.168.126.90;

    location ~ /zzz/ {
        proxy_pass  http://127.0.0.1:9001;
    }

    location ~ /yyy/ {
        proxy_pass  http://127.0.0.1:9002;
    }
}

分别测试

访问 192.168.x.x:82/zzz/

访问192.168.x.x:82/yyy/

这里的一个场景就是可以合并运行在不同端口的服务到一个端口,使用一个后缀区分开,可以很大的节约端口占用,dns也可以只用一个

负载均衡

实现的效果 访问 192.168.x.x:83/zzz/的时候,负载均衡到 9001 和 9002

环境准备:在之前的tomcat2里面新建一个zzz的文件夹,同样加上index.html

upstream myserver {
	server 192.168.126.90:9001;
	server 192.168.126.90:9002;
}
server {
	listen 83;
	server_name 192.168.126.90;
	location / {
	proxy_pass http://myserver;
}

请求会被平均分配到 9001 和 9002

nginx 分配服务器的策略

第一种:轮询(默认)

第二种:weight

weight代表权重默认是1,权重越高被分配的客户端越多

upstream myserver {
    server      192.168.73.20:8080	weight=10;
    server      192.168.73.20:8081 weight=5;
        }

第三种:每个请求按照ip的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题

upstream myserver {
	ip_hash;
    server      192.168.73.20:8080;
    server      192.168.73.20:8081;
        }

第四种 fair(这个我这边测试不识别)

upstream myserver {
    server      192.168.73.20:8080;
    server      192.168.73.20:8081;
    fair;
        }

按后端服务器的响应时间来分配请求,响应时间短的优先分配

动静分离

image-20210526095445803

通过 location 指定不同后缀名实现不同的请求转发,通过 expires 参数设置,可以指定浏览器过期,减少与服务器之间的请求和流量

准备工作

推荐个 shell 中查看文件的工具 tree

yum install -y tree # 就可以安装了

image-20210526102920019

创建这样的文件结构

server {
        listen 85;
        server_name 192.168.126.90;
        location /www/ {
                root /data/;
                index index.html index.htm;
        }

        location /image/ {
                root /data/;
                autoindex on; 
        }
}

测试 http://192.168.126.90:85/image/zz.jpg 访问到图片

autoindex on; 列出文件夹的内容

http://192.168.126.90:85/www/a.html 访问到网页

这样就可以做到静态请求走nginx服务器不走tomcat了

nginx配置高可用集群

image-20210526110333594

需要的环境:

需要两台nginx服务器

需要keepalived

需要虚拟ip

准备工作:

两台服务器

192.168.126.90

192.168.126.91

  1. 两台安装nginx

两台的nginx配置(先复用之前的tomcat 90上面的)

server {
        listen       80;
        server_name  192.168.126.90; # 本机 ip 另外一台 91的 这里改成 91

        location / {
		proxy_pass http://192.168.126.90:8080
        }
    }

分别测试能否单独访问 访问 192.168.126.90 和 192.168.126.91 测试能否反向代理到同一个位置 这里是tomcat http://192.168.126.90:8080

  1. keepalived 相关安装与配置

    keepalived 安装

yum install -y keepalived
rpm -q -a keepalived # keepalived-1.3.5-19.el7.x86_64

配置文件在 /etc/keepalived/keepalived.conf

# 启动 nginx
nginx
# 重新加载配置
nginx -s reload
# 启动 keepalived
systemctl start keepalived
# 检测这两个服务是否正常启动
ps -ef | grep nginx
ps -ef | grep keepalived

两台服务器确定nginx和keepalived安装没有问题

两台的 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.126.90
 smtp_connect_timeout 30
 router_id LVS_DEVEL  # 访问到主机
}
vrrp_script chk_http_port {
 script "/usr/local/src/nginx_check.sh"
 interval 2 #(检测脚本执行的间隔)
 weight 2
}
vrrp_instance VI_1 {
 state MASTER # 备份服务器上将 MASTER 改为 BACKUP 
 interface ens33 //网卡
 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
 advert_int 1
 
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.126.99 // VRRP H 虚拟地址 
 } }

执行检测的脚本 路径在 /usr/local/src/nginx_check.sh

#!/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

这里的 /usr/sbin/nginx 是 nginx 启动的位置 yum 安装的默认存放位置在这里

测试

1.访问 虚拟ip 192.168.126.99 可以跳转到tomcat

2.停掉主节点的keepalived 和 nginx

systemctl stop keepalived
nginx -s stop
# 检测这两个服务是否被停掉
ps -ef | grep nginx
ps -ef | grep keepalived

先测试 192.168.126.90 如果不能访问,说明主节点的nginx服务已经被停掉(模拟宕机)

再测试 192.168.126.91 从节点,正常

最后测试 高可用是否实现 192.168.126.99 正常访问

一点彩蛋

为了模拟的更接近实际情况,我们再创建一台虚拟机 192.168.126.92

在上面创建 两个 tomcat 服务(9001和9002) 可以参考反向代理2 分别是我们的商品(product)服务和会员(member)服务(index的内容就分别是 product 和 member 模拟访问到这两个服务)

docker run -p 9001:8080 -v /usr/local/src/tom1:/usr/local/tomcat/webapps --name tom1 -d tomcat:8
docker run -p 9002:8080 -v /usr/local/src/tom2:/usr/local/tomcat/webapps --name tom2 -d tomcat:8

image-20210526123513313

测试访问 192.168.126.92:9001/product/ 192.168.126.92:9002/member/ (当然了这两个服务也可以不在一个服务器上)

先修改我们的proxy 地址为 我们的92的服务地址(模拟真实的tomcat服务器)

先测试商品服务(同时修改主从两个 nginx 的配置文件)

location /product/ {
		proxy_pass http://192.168.126.92:9001;
        }
location /member/ {
		proxy_pass http://192.168.126.92:9002;
        }

测试 192.168.126.99/product/

image-20210526122159377

测试 192.168.126.99/member/

image-20210526123028177

正常返回

反向代理两个服务

加点料

我们试想哈,双11前夕,商品服务流量剧增,客户那边反馈说商品打不开了,客服小姐姐收到好多用户投诉

啊,cto找到你说,zz, 咱们的商品服务快顶不住了,赶紧加服务器

于是我们又多了一个tomcat服务 9003 (这里用新的 index 来区分访问了不同的端口)

docker run -p 9003:8080 -v /usr/local/src/tom1-plus:/usr/local/tomcat/webapps --name tom1-plus -d tomcat:8

可是怎么加到目前的系统里面呢,服务器可不能中途停掉啊

对了,nginx 的 reload 机制可以平滑的更新,我们让 192.168.126.99/product/ 负载到 9001和9003这两个端口 先定义好负载的策略,然后更新,不就是可以解燃眉之急了嘛

upstream product {
	server 192.168.126.92:9001;
	server 192.168.126.92:9003;
}

    server {
        listen       80;
        server_name  192.168.126.91; # 90 和 91 主从

        location /product/ {
		proxy_pass http://product;
        }
		location /member/ {
		proxy_pass http://192.168.126.92:9002;
        }

        
    }

(测试:访问192.168.126.99/product/, 分别负载到了9001 和 9003 )

“nginx -s reload” 敲完这行指令,服务器的负载下来了一点,zz擦了擦额头上的汗,搬着电脑跑到cto那里,指了指屏幕上服务器负载的监控,“搞定了!”

cto看到原来的服务器(9001)的负载降到了百分之七十,松了一口气, “不错不错,今晚加个鸡腿”,但当看到加进来的服务器(9003)负载只有百分之十,推了推眼镜,“不对啊,加进来的这台服务器怎么负载这么低”,“啊?”,“加进来这台是128h256g的,原来的那台是32h64g的,后面如果负载又上去了,32g那台又会负载过高,能不能做到更好的利用计算资源,这样吧,节约的计算资源的开销的百分之二十给你发年终奖”,“啊,好啊,说到这我可就不困了,我再想想”

结束

“一台 128 ,一台 32,权重 4 :1,进行负载不就可以解决这个问题了吗”

upstream product {
	server 192.168.126.92:9001 weight=1;
	server 192.168.126.92:9003 weight=4;
}

“nginx -s reload”,两台服务器负载变得一样了

zz也如愿拿到了年终奖,他的办公桌上也多了一个他喜欢的手办(完)

nginx 的原理

master和worker

一个 master 和多个 worker

好处:

1.可以使用 nginx -s reload 热部署,利用 nginx 进行热部署操作

2.每个worker是独立的进程,如果有其中的一个 worker 出现问题,其他的worker独立的,继续进行争抢,实现请求过程,不会造成服务中断

设置多少个 worker 合适

worker 数和服务器的cpu数相等是最为合适的

连接数 owrker_connection

发送请求,占用了 worker 的几个连接数

​ 2或者4

nginx有一个master,有四个worker,每个worker支持最大的连接数据 1024,支持的最大并发数

4 * 1024/2或者 4 * 1024/4

静态访问 worker_connetion * worker_process / 2

反向代理 worker_connetion * worker_process / 4

补充

whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx

以下是Nginx的默认路径:
(1) Nginx配置路径:/etc/nginx/
(2) PID目录:/var/run/nginx.pid
(3) 错误日志:/var/log/nginx/error.log
(4) 访问日志:/var/log/nginx/access.log
(5) 默认站点目录:/usr/share/nginx/html

docker版本 nginx 的使用

docker pull nginx
docker run --name nginx-test -p 80:80 -d nginx
mkdir -p /root/nginx/www /root/nginx/logs /root/nginx/conf
docker ps -a
docker cp 481e121fb29f:/etc/nginx/nginx.conf /root/nginx/conf
docker stop nginx-test
docker run -d -p 80:80 --name nginx-web -v /root/nginx/www:/usr/share/nginx/html -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx nginx

nginx 配置需账号密码登陆

htpasswd

yum -y install httpd-tools 
# 需要 cd 到 /etc/nginx 目录去执行
htpasswd -c pass.db wang  //wang 并输入密码
# 会在/etx/nginx/passwd.db文件中生成用户名和加密的密码:myuser:YlmaHlkJnzhxG
htpasswd pass.db username

Nginx 中

这里做了统一的反向代理到 我们创建的 25698 的nginx容器中

server {
    listen       92;
    server_name  localhost;

    auth_basic "User Authentication";
    auth_basic_user_file /etc/nginx/pass.db;

    location / {
    	   proxy_pass http://localhost:25698;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值