Nginx笔记
内容概览
1、Nginx 简介
1.1 Nginx 概述
1.2 Nginx 作为web服务器
1.3 正向代理
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211125185527763-1317866831.png)
1.4 反向代理
反向代理服务器去选择目标服务器获取数据后,在返回给客户端
,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。1.5 负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
1.6 动静分离
为了加快网站的解析速度
,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、Nginx 安装
2.1 进入 nginx 官网,下载
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126105523811-1193455384.png)
2.2 安装 nginx
(1)安装 pcre 依赖
(a)下载pcre安装包
cd /opt/software/ ls wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz ls
(b)解压文件
tar -zxvf pcre-8.37.tar.gz -C /opt/module/ cd /opt/module/ ls
(c)进入解压之后的目录,执行./configure
cd pcre-8.37/ ./configure
(d)使用 make && make install
make && make install
(e)查看版本
pcre-config --version
(2)安装 openssl 、zlib 、 gcc 依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
(3) 安装 nginx
(a)上传nginx安装包到服务器
(b) 解压压缩文件
tar -zxvf nginx-1.12.2.tar.gz -C /opt/module/ cd /opt/module/ ll
(c)进入解压之后的目录,执行./configure
cd nginx-1.12.2/ ./configure
(d)使用 make && make install
make && make install
(e) 进入目录 /usr/local/nginx/sbin/nginx 启动服务
cd /usr/local/nginx/sbin/ ./nginx
ps -ef|grep nginx
(f)访问测试
在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题 (1)关闭防火墙 (2)开放访问的端口号,80 端口 查看开放的端口号 firewall-cmd --list-all 设置开放的端口号 firewall-cmd --add-service=http –permanent firewall-cmd --add-port=80/tcp --permanent 重启防火墙 firewall-cmd –reload
3、nginx 常用的命令和配置文件
3.1 nginx 常用的命令
(1)启动命令
在/usr/local/nginx/sbin 目录下执行
./nginx
(2) 关闭命令
在/usr/local/nginx/sbin 目录下执行
./nginx -s stop
(3)重新加载命令
在/usr/local/nginx/sbin 目录下执行
./nginx -s reload
(4)查看nginx 版本号
在/usr/local/nginx/sbin 目录下执行
./nginx -v
3.2 nginx.conf 配置文件
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:
根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分
:
(1)第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:
这是 Nginx 服务器并发处理服务的关键配置,worker_processes
值越大,可以支持的并发处理量也越多
,但是会受到硬件、软件等设备的制约
(2)第二部分: events 块
比如上面的配置:
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,worker_connections,每个 wordprocess 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024.这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
(3)第三部分: http 块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块、server 块。
①、http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
4、docker 安装 nginx
4.1 获取nginx镜像
(1)搜索nginx镜像列表
docker search nginx
(2) 拉取nginx镜像到本地,此处我们获取排名第一的是官方最新镜像,其它版本可以去DockerHub查询
docker pull nginx
(3)查看我们拉取到本地的nginx镜像IMAGE ID
docker images nginx
4.2 创建 nginx 容器
(1)实例化容器
docker run -d --name mynginx -p 80:80 nginx -d 指定容器以守护进程方式在后台运行 --name 指定容器名称,此处我指定的是mynginx -p 指定主机与容器内部的端口号映射关系,格式 -p [宿主机端口号]:[容器内部端口],此处我使用了主机80端口,映射容器80端口
(2)查看到正在运行的nginx容器
docker ps
在浏览器访问CentOS主机,会看到nginx欢迎页,如果你是云服务器,请记得开放对应的外网端口!!!!
到这里我们已经完成了nginx容器的搭建,但是此时还有个问题,我们如何修改nginx的配置文件?
4.3 如何修改 nginx 的配置文件
这里有两种方式解决这个问题:
4.3.1 方式一:每次都进入到nginx容器内部修改
每次都进入到nginx容器内部修改。适合改动少,简单使用的情况
(1)进入到nginx容器内部
docker exec -it mynginx /bin/bash exec 命令代表附着到运行着的容器内部 -it 是 -i 与 -t两个参数合并写法,-i -t 标志着为我们指定的容器创建了TTY并捕捉了STDIN /bin/bash 指定了执行命令的shell
(2)进入nginx容器内部后,查看相关配置文件
cd /etc/nginx/
ls -l
而nginx容器内的默认首页html文件目录
为/usr/share/nginx/html
日志文件位于/var/log/nginx
(3)执行exit
命令我们可以从容器内部退出
。
4.3.2 方式二:将 nginx 容器内部配置文件挂载到主机
将nginx容器内部配置文件挂载到主机,之后就可以在主机对应目录修改即可。适合频繁修改,复杂使用的情况
(1)在主机/mydata目录
下执行 mkdir -p ./nginx/{conf,html,logs}
创建挂载目录
cd /mydata/ ls mkdir -p ./nginx/{conf,html,logs} ls cd nginx/ ls
(2)将容器内的nginx.conf
与default.conf
文件分别拷贝到主机/mydata/nginx
和/mydata/nginx/conf
下,分别执行
docker cp mynginx:/etc/nginx/nginx.conf ./ docker cp mynginx:/etc/nginx/conf.d/default.conf ./conf/
cp 命令代表复制
/etc/nginx/nginx.conf 是容器内部nginx.conf 路径
此时我们的目录结构是这样的,这就是我们等会儿要与nginx容器挂载的目录
(3)执行docker stop mynginx
命令停止刚刚创建的nginx容器,b3是容器Id,然后执行docker rm mynginx
移除容器,
(4)执行
docker run -d --name mynginx -p 80:80 -v /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mydata/nginx/logs:/var/log/nginx -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/conf:/etc/nginx/conf.d --privileged=true nginx
-v 挂载目录,格式 -v: 表示将主机目录与容器目录之间进行共享,
--privileged=true 容器内部对挂载的目录拥有读写等特权
(5)这时候,会出现403,不要惊慌。我们的主机挂载 /mydata/nginx/html目录还为空
这时我们在容器的挂载 /mydata/nginx/html
目录下创建index.html
,内容随便写上hello docker nginx,再次访问主机IP
到这里就大功告成了!
需要注意的:我们在挂载目录的操作,都实际会映射到容器内部,写配置文件的时候一定要注意路径问题!!
5、nginx 配置实例—反向代理
5.1 反向代理实例一
#(0)先上传tomcat安装包到/opt/software目录下 cd /opt/software/ ls #(1)解压安装包 tar -zxvf apache-tomcat-7.0.70.tar.gz -C /opt/module/ cd /opt/module/ ls #(2)进入bin目录,启动tomcat cd apache-tomcat-7.0.70/bin/ ./startup.sh
(b) 对外开放访问的端口
#对外开放访问的端口 firewall-cmd --add-port=8080/tcp --permanent firewall-cmd –reload #查看已经开放的端口 firewall-cmd --list-all
(c) 在 windows 系统中通过浏览器访问 tomcat 服务器
(3)具体配置
(a)在Windows 系统的 hosts 文件进行域名和 ip 对应关系的配置
添加内容在hosts文件
192.168.184.208 www.123.com
配置完成之后,我们便可以通过 www.123.com:8080 访问到第一步出现的 Tomcat 初始界面。那么如何只需要输入 www.123.com 便可以跳转到 Tomcat 初始界面呢?便用到 nginx
(b)在nginx.conf 配置文件中增加如下配置
5.2 反向代理实例二
(1)实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001,
server { listen 9001; server_name 192.168.184.208; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } }
(b)开放对外访问的端口号 9001 8080 8081
(4)重启nginx测试
6、nginx 配置实例—负载均衡
(1)实现效果
(2)准备工作
(3)在 nginx 的配置文件中进行负载均衡的配置
upstream myserver { server 192.168.184.208:8080; server 192.168.184.208:8081; } server { listen 80; server_name 192.168.184.208; location / { proxy_pass http://myserver; } }
(4)nginx 分配服务器策略
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126163304674-1250789903.png)
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126163344032-529597966.png)
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126163403169-625202829.png)
7、nginx 配置实例—动静分离
(1)什么是动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开
,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过location 指定不同的后缀名实现不同的请求转发。
通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
(2)准备工作
(a)在 liunx 系统中准备静态资源,用于进行访问
(3)具体配置
(a)在 nginx 配置文件中进行配置
server { listen 80; server_name 192.168.184.208; location /www/ { root /data; index index.html index.html; } location /image/ { root /data; autoindex on; } }
(4)重启测试
(a)在浏览器中输入地址
http://192.168.184.208/image/01.jpg
* 因为配置文件 autoindex on
(b)在浏览器 地址栏输入地址
http://192.168.184.208/www/a.html
8、nginx 配置高可用集群
8.1 什么是 nginx 高可用
8.2 配置高可用的准备工作
cd /opt/software/
yum install keepalived –y
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126171827395-1764938451.png)
8.4 完成高可用配置(主从配置)
(1)修改主服务器192.168.184.208 的/etc/keepalived/keepalivec.conf 配置文件
#全局配置 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.184.208 #主机ip smtp_connect_timeout 30 router_id LVS_DEVEL #服务器域名名字,可在/etc/hosts中查看127.0.0.1映射的域名 } #脚本配置 vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh"#脚本路径 interval 2 #(检测脚本执行的间隔);每隔2s检查一次 weight 2 #设置服务器权重 } #虚拟ip的配置 vrrp_instance VI_1 { state Master# Master为Master;Salve为BACKUP interface ens33 #网卡;可以用ip addr 看网卡名 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 #每1s发送一次心跳 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.184.301 // VRRP H 虚拟ip地址,多台keepalived绑定一个ip;必须同一网段 } }
(2) 在主服务器192.168.184.208 的/usr/local/src 添加检测脚本
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #nginx启动路径 sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived #nginx挂掉后,杀掉这个服务器的所有keepalived进程 fi fi
(3)修改从服务器192.168.184.209 的/etc/keepalived/keepalivec.conf 配置文件
#全局配置 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.184.208 #主机ip smtp_connect_timeout 30 router_id LVS_DEVEL #服务器域名名字,可在/etc/hosts中查看127.0.0.1映射的域名 } #脚本配置 vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh"#脚本路径 interval 2 #(检测脚本执行的间隔);每隔2s检查一次 weight 2 #设置服务器权重 } #虚拟ip的配置 vrrp_instance VI_1 { state BACKUP# Master为Master;Salve为BACKUP interface ens33 #网卡;可以用ip addr 看网卡名 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 #每1s发送一次心跳 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.184.301 // VRRP H 虚拟ip地址,多台keepalived绑定一个ip;必须同一网段 } }
(4) 在从服务器192.168.184.209 的/usr/local/src 添加检测脚本
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #nginx启动路径 sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived #nginx挂掉后,杀掉这个服务器的所有keepalived进程 fi fi
(5) 把两台服务器上 nginx 和 keepalived 启动
![](https://img2020.cnblogs.com/blog/1211355/202111/1211355-20211126180047245-2122362037.png)
8.5 最终测试
(1) 在浏览器地址栏输入 虚拟 ip 地址 192.168.184.301
9、nginx 的原理