安装 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
分为三部分:
-
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
比如说 worker_processes 1; worker_processes 值越大,可以支持的并发处理量就越多
-
event块
event块涉及的指令主要影响Nginx服务器与用户的网路连接
比如 worker_connections 1024; 支持的最大连接数
-
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
- 启动两个 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](https://sugon666.oss-cn-hangzhou.aliyuncs.com/typora-user-images/typora-user-images/image-20210526095445803.png)
通过 location 指定不同后缀名实现不同的请求转发,通过 expires 参数设置,可以指定浏览器过期,减少与服务器之间的请求和流量
准备工作
推荐个 shell 中查看文件的工具 tree
yum install -y tree # 就可以安装了
创建这样的文件结构
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配置高可用集群
需要的环境:
需要两台nginx服务器
需要keepalived
需要虚拟ip
准备工作:
两台服务器
192.168.126.90
192.168.126.91
- 两台安装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
-
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
测试访问 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](https://sugon666.oss-cn-hangzhou.aliyuncs.com/typora-user-images/typora-user-images/image-20210526122159377.png)
测试 192.168.126.99/member/
![image-20210526123028177](https://sugon666.oss-cn-hangzhou.aliyuncs.com/typora-user-images/typora-user-images/image-20210526123028177.png)
正常返回
反向代理两个服务
加点料
我们试想哈,双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;
}
}