Nginx
一 基本概念
什么是Nginx
- 高性能的Htttp和反向代理web服务器
- 特点: 占用内存少, 并发能力强
- 专为性能优化而开发, 性能是其最重要的考量, 经测试能支持高达50000个并发连接数,
- 支持热部署, 可以 7*24 不间断使用
反向代理
- 正向代理
- 客户端不能直接连接到服务端,这个时候就需要找一个代理服务器, 通过代理服务器去连接服务端
- 反向代理
- 我们只需要将请求发送到反向代理服务器, 由反向代理服务器去选择目标服务器去获取数据后,再返回给客户端, 此时反向代理服务器与目标服务器对外就是一个服务器, 暴露的是代理服务器的地址, 隐藏了真实服务器的IP地址
负载均衡
- 客户端发送多个请求到服务器, 服务器处理请求, 有一些可能需要与数据库进行交互, 服务器处理完毕后, 返回给客户端
- 👆 在小数据量的情况下和还可以进行, 但是大计算量的任务则有肯能就出现宕机
- 单个服务器解决不了, 我们增加服务器数量, 然后将请求分发到各个服务器上,
- 将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上, 将负载分发到不同的服务器, 也就是我们说的负载均衡
- 客户端首先经过反向代理服务器, 通过反向代理服务器, 将请求平均分发到各个服务器上
动静分离
- 为了加快网站的解析速度, 可以把动态页面和静态页面由不同的服务器来解析, 加快解析速度, 降低原来单个服务器的压力
- 使用动静分离
两种处理方式
- 一种是纯粹将静态文件独立成单独的域名, 房子阿迪ulinix的服务器上, 也是目前主流推崇的方案
- 一种是将动态和静态文件混合在一起发布, 通过nginx来分开
高可用
- 需要两台nginx服务器
- 需要keepalived
- 需要虚拟ip
二 Nginx安装,命令,配置
Nginx安装(Linux系统)
1 安装pcre依赖
2 make && make install # 编译并安装
pcre-config -version # 查看版本号
3 安装其他的依赖
yum y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
4 安装Nginx
# 配置防火墙
1, 查看开放的端口号
firewall-cmd--list-all
2, 设置开放的端口号
firewall-cmd--add-service=http-permanent
sudo firewall-cmd--add-port=80/tcp--permanent
3, 重启防火墙
firewall-cmd --reload
Nginx常用命令
- 使用Nginx操作命令前提条件: 必须进入Nginx目录
# 1 查看Nginx版本号
./nginx -v
# 2 启动Nginx
./nginx
# 3 关闭Nginx
./nginx -s stop
# 4 重新加载Nginx (更改后不需要重启服务器, 只需要重新加载下配置文件)
./nginx -s reload
Nginx配置文件
- 文件路径 /user/local/nginx
Nginx配置文件组成
-
nginx配置文件有是哪部分组成
-
第一部分 全局块
- 从配置文件开始到events块之间的内容, 主要会设置一些影响nginx服务器整体运行的配置指令
- 比如: worker_process: 该值越大, 可以支持的并发处理量越多
-
第二部分 events块
- 涉及的指令主要影响nginx服务器与用户的网络连接
- 比如: worker_connections: 1024 # 最大的连接数 动态配置(根据实际情况)
-
第三部分 HTTP块
Nginx 服务器配置中最频繁的部分
http块也可以包括HTTP全局块, server块
- server块
- listen: 80 # 监听的端口号
- server_name # ip地址
- location # 映射地址
- server块
-
location 指令
- 1、=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- 2、~:用于表示uri包含正则表达式,并且区分大小写。
- 3、**:用于表示uri包含正则表达式,并且不区分大小写。
- 4、~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后, 立即使用此location处理请求, 而不再使用location块中的正则uri和请求字符串做匹配
三 Nginx配置实例
一, 反向代理
配置实例一
- 实现效果
- 打开浏览器, 在浏览器地址输入地址 www.mypath.com 跳转到linux系统Tomcat主页
- 准备工作
- 在Linux系统安装Tomcat, 使用默认端口 8080
- 进入 Tomcat 的 bin 目录, 使用./startup.sh 启动Tomcat服务器
- 修改防火墙配置, 开放 80 8080 端口
- 在Linux系统安装Tomcat, 使用默认端口 8080
- 访问过程
-
windows浏览器, 解析域名www.mypath.com --> nginx代理服务器 --> Tomcat
- 域名解析: 先从本地查找映射, 如果没有找到, 则在网络上dns服务器上查找
-
配置本地映射
- 找到hosts文件, ip www.mypath.com
-
在nginx进行请求转发的配置
- cd /user/lkocal/nginx
- vi conf
- path: http-server
- 修改 server_name
- 添加 proxy_pass http://127.0.0.1:8080
-
最终测试
- 实现预期实现效果
-
配置实例二
-
实现效果
- 使用nginx反向代理, 根据访问的路径跳转到不同端口的服务中
- nginx监听端口为9001
- 访问http://127.0.0.1:9001/fj/直接跳转到127.0.0.1:8080
访问http://127.0.0.1:9001/api/直接跳转到127.0.0.1:8081
-
准备工作
- 准备两个Tomcat服务器, 一个8080端口, 一个8081端口
- 在Tomcat中的webapp中创建fj 和 api文件夹和测试文件
-
具体配置
-
找到nginx配置文件, 进行反向代理配置
-
cd /user/lkocal/nginx
-
vi conf
-
path: http-server
server{ listen 9001; server_name 127.0.0.1; # 暴露给外部的ip地址 location ~ /fj/{ proxy_pass http://127.0.0.1:8080; } location ~ /api/{ proxy_pass http://127.0.0.1:8081; } }
-
-
开放防火墙对外访问端口号 9001 8080 8081
-
二, 负载均衡
-
实现效果
- 在浏览器地址栏中输入地址: http://mypath/pj/a.html, 负载均衡效果, 平均8080,8081端口中
-
准备工作
-
准备多台Tomcat服务器(此处暂设2台) 一台 8080, 一台8081
-
在两台Tomcat里面webapps目录中, 创建名称是pj文件夹, 在pj文件夹中创建a.html, 用于测试
- 文件夹名称要统一
-
在 nginx 配置文件中配置
http { upstream myserver{ ip_hash; server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=1; } server { server_name 127.0.0.1 # 暴露给外部的ip地址 location / { 。。。。 proxy_pass http://myserver; # 上面的 myserver 名称 proxy_connect_timeout 10; } } }
-
-
nginx分配服务器策略
-
轮询(默认策略)
- 每一个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器宕机, 能自动剔除, 访问没有宕机的服务器
-
weight
- weight 代表权值 默认为 1, 权重越高被分配的客户端越多
-
ip_hash
- 每个请求按访问ip的hash结果进行分配
- 这样每个访客固定访问一个后端服务器, 可以解决Session的问题
-
fair(第三方)
- 根据后端服务器的响应时间来分配, 哪个相应时间短就分配给客户端哪个服务器
-
三, 动静分离
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏
览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源
设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,
如果有修改,则直接从服务器重新下载,返回状态码200。
-
准备工作
-
编辑配置文件
-
-
测试
- 在浏览器中输入 server_name/www/index.html
- 访问对应网页
- 在浏览器中输入 server_name/images
- 列出文件夹始终的文件列表
- 在浏览器中输入 server_name/images/a.png
- 展现图片
- 在浏览器中输入 server_name/www/index.html
四, 高可用
-
问题:
- 当nginx服务器宕机, 请求无法实现效果
-
准备工作
- 需要两台服务器 192.168.10.1 192.168.10.2
- 在两台服务器上安装nginx
- 在两台服务器安装keepalived
- 使用yum 命令安装 yum install keepalived -y
- 查看是否已经安装
- rpm -q -a keepalived
- 安装位置:
- /etc/keepalived
- 配置文件位置
- /etc/keepalived/keepalived.conf
-
主备配置(进行高可用配置)
-
配置脚本文件
-
在 /usr/local/src/ 添加 nginx_check.sh 脚本文件
# ! / bin / bash A='ps -C nginx -no-header |wc -1\' if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ 'ps -C nginx --no-header |wc -1' -eq 0 ]; then killall keepalived fi fi
-
修改 /etc/keepalived/keepalived.conf 配置文件
# 全局配置 giobal dets { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.17.129 # 主 备 ip smtp_connect_timeout 30 router_id LVS_DEVEL # 可以为 ip 唯一的值 # 访问的主机 host文件 127.0.0.1 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 # 网卡 ifconfig 查看网卡名称 virtual_router_id 51 #主、备机的virtual router id必须相同 priority 100 # 主、备机取不同的优先级,主机值较大(100),备份机值较小(90) advert_int 1 # 心跳检测 检测主机是否宕机 默认为一秒检测一次 authentication { auth type PASS auth_pass 1111 } virtual ipaddress { 192.168.17.50 # VRRPH 虚拟地址 } }
-
将两台服务器上的nginx 和keepalived 启动
- ./nginx
- systemctl start keepalived.service
-
四 Nginx原理
-
master & worker
-
worker 工作模式
- 管理员发送个请求 到达 master, worker 通过争抢机制得到任务, 然后通过反向代理进入Tomcat
一个master和多个worker的好处
- 可以使用 nginx -s reload # 热部署
- 对于每一个worker是独立的进程, 不需要加锁, 减小了一定的开销
- 保证服务不会中断, 一个 worker 宕机 其他 worker 可以继续争抢
如何设置worker数量
worker数和服务器的cpu数相当是最为适宜的(每个worker可以把一个CPU的性能发挥到极致)
连接数 worker_connection
- 发送请求, 占用了worker的几个连接数?
- 2 个或者 4 个
- 2: 访问静态资源: 只需要访问 nginx 来回各一个连接
- 4: 访问动态资源: 需要访问 Tomcat 需要与Tomcat也建立一个往返连接
- 2 个或者 4 个
- nginx有一个master,有四个worker, 每个worker支持最大的连接数据1024, 支持的最大并发数是多少
- 得到woker最大支持的连接数 4(worker数量) * 1024(每个worker支持的连接数量)
- 如果是普通的静态访问 则 第一步得到的结果 除以 2
- 如果是http作为反向代理 则 第一步得到的结果 除以 4