Nginx学习笔记

\color{red}{最近开通了公众号,希望喜欢本文章的小伙伴关注哈。}
\color{red}{最近开通了公众号,希望喜欢本文章的小伙伴关注哈。}
\color{red}{最近开通了公众号,希望喜欢本文章的小伙伴关注哈。}

yunqing.jpg
.

1.什么是Nginx?
Nginx是一个高性能的HTTP反向代理服务器,特点是占用内存小,并发能力强。Nginx是专为性能优化而开发的,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
详细介绍见 https://lnmp.org/nginx.html

2.反向代理
(1)正向代理:
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。


image.png

(2)反向代理:
客户端不需要做任何配置,只需要把请求发送到反向代理服务器,反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器在客户端眼里就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址。


image.png

3.负载均衡
例如双11当天,并发量相当庞大,达到一个顶级的配置的服务器也承担不了的并发量,这样就增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器就是负载均衡。
如下图,反向代理服务器通过负载均衡把15个请求平均分担到3个服务器。

image.png

4.动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力。


image.png

Nginx的常用命令

1.使用nginx命令的前提条件是进入到nginx的目录

cd /usr/local/nginx/sbin

2.查看nginx的版本号

./nginx -v

3.启动nginx

./nginx

4.关闭nginx

./nginx -s stop

5.重新加载nginx
修改nginx配置文件之后,不必重启nginx,重新加载nginx就行

./nginx -s reload

Nginx配置文件

1.位置在:

/usr/local/nginx/conf/nginx.conf

2.nginx配置文件组成
(1) 三部分组成

  • 第一部分:全局块
    从开始到events块之间的部分内容,主要设置一些影响nginx服务器整体运行的配置指令,例如 worker_processes 1 值越大,可以支持的并发数量也越多。

  • 第二部分:events块
    events块设计的指令主要影响nginx服务器与用户的网络连接,例如worker_connections 1024 支持的最大连接数,对nginx的性能影响较大,应该灵活配置。

  • 第三部分:http块
    ①http全局块
    http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
    ②server块
    最核心需要配置的部分。

Nginx配置实例-反向代理

1.实现效果
(1)打开浏览器访问www.123.com,跳转到Linux系统tomcat的主页面。

image.png

2.准备工作
(1)Linux安装nginx
(2)Linux安装Tomcat
安装教程见https://www.jianshu.com/p/de8dbe029cee

3.访问过程分析


8020666-1863640586c4ac5e.png

4.具体配置
(1)首先修改hosts文件,最后一行加上这个。因为浏览器解析域名会先到hosts文件中找对应的ip地址,没找到才会去网络中根据DNS解析。这样www.123.com就会被解析到ip为192.168.186.128的Linux服务器上了。

image.png

(2)在nginx配置文件中进行配置反向代理。
image.png

nginx的配置文件中这样配置到,如红线画的部分,当访问192.168.186.128的80端口的时候,请求会被转发到http://127.0.0.1:8080上。
image.png

Nginx反向代理实例2

1.实现效果
使用nginx监听9001端口,反向代理根据不同的访问路径跳转到不同端口的服务中。

访问http://192.168.186.128:9001/edu/ 直接跳转127.0.0.1:8080
访问http://192.168.186.128:9001/vod/ 直接跳转127.0.0.1:8081

2.准备工作
(1)准备两个Tomcat服务器,一个8080端口,一个8081端口
(2)创建文件夹和测试页面分别在两个tomcat的webapps文件中创建edu文件夹和vod文件夹,里面分别放入相应的测试页面文件。
这块遇到了一个大坑,就是一台centos7的机器同时开两个Tomcat的问题,网上试了很多教程都不行。

*****begin 一台CentOS7同时启动两个Tomcat教程*****

  • 首先我用的tomcat9版本,解压缩重命名分别放在了以下两个位置,解压后重命名为了tomcat和tomcat1
/usr/local/tomcat
和
/usr/local/tomcat1
  • 其次,修改/etc/profile文件,注意看tomcat部分
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/root/installFile/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
########## tomcat ###########
export CATALINA_BASE=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat
export TOMCAT_HOME=/usr/local/tomcat
########## tomcat ############
########## tomcat1 ###########
export CATALINA_BASE2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1
##########tomcat1#############

  • 修改tomcat的配置
    第一个tomcat不用做修改,修改第二个tomcat,如果有多个,则第一个不用修改,其余都要。
    修改这个文件 vim /usr/local/tomcat1/bin/catalina.sh
# OS specific support. $var must be set to either true or false. 

注释和内容之间的上面这句话后面添加:

export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
  • 修改/usr/local/tomcat1/conf/server.xml文件,把端口号改成8081,第一个tomcat不用改,其余的都要改。
    我更改的3个地方,可以改成其他端口,自己决定
<Server port="8005" shutdown="SHUTDOWN"> #8005修改成8015

<Connector port="8080" protocol="HTTP/1.1" #8080修改成8081
connectionTimeout="20000"
redirectPort="8443"  URIEncoding="UTF-8" />
 #添加URIEncoding="UTF-8" 防止乱码

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>    #8009修改成8019

  • 设置开机自启(注意此部分取自网络,未经亲测)
    原文链接:https://blog.csdn.net/zhizhenjie/article/details/82662980
    1、因为启动tomcat会调用tomcat安装文件中的startup.sh,而它调用了catalina.sh,然后catalina.sh则调用了setclasspath.sh。所以需要在setclaspath.sh中添加JAVA_HOME和JRE_HOME两个环境变量
    分别编辑两个tomcat中的setclasspath.sh文件:
    vi /usr/local/tomcat8/bin/setclasspath.sh

在 # Set JAVA_HOME or JRE_HOME…下边添加javahome:

 # -----------------------------------------------------------------------------
 #  Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
 #  are valid and consistent with the selected start-up options and set up the
 #  endorsed directory.
 # -----------------------------------------------------------------------------
export JAVA_HOME=/usr/local/jdk1.8.0_181
export JRE_HOME=/usr/local/jdk1.8.0_181/jre

2、在/usr/lib/systemd/system目录下增加tomcat.service文件,内容如下:

[Unit]
Description=tomcat
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/tomcat8/bin/startup.sh
ExecStart=/usr/local/tomcat8.1/bin/startup.sh
ExecStop=/usr/local/tomcat8/bin/shutdown.sh
ExecStop=/usr/local/tomcat8.1/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

将两个tomcat的启动程序都添加进去,

然后执行systemctl enable tomcat 使生效;开机启动就设置好了。

*****stop 一台CentOS7同时启动两个Tomcat教程*****

3.具体配置


image.png

记得开放对外访问端口9001和8080和8081

firewall-cmd --zone=public --add-port=8081/tcp --permanent   //开启8081端口
firewall-cmd --zone=public --add-port=9001/tcp --permanent   //开启9001端口
systemctl restart firewalld.service //重启防火墙
firewall-cmd --reload //重新载入防火墙配置

4.亲测效果


image.png

image.png

5.location指令具体说明
该指令用于匹配 URL。
语法如下:

location [ = | ~ | ~* | ^~ ] uri {

}

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~
标识。

Nginx配置实例-负载均衡

1.实现效果
浏览器输入http://192.168.186.128:8080/edu/index.html经过nginx负载均衡,平均分配到8080和8081端口中。
2.准备工作

  • 准备两台tomcat一台8080,一台8081,上面已经准备好了。
  • 在两台tomcat的webapps的文件夹下都创建edu文件夹,里面都创建index.html文件。

3.在nginx中配置负载均衡
①如下图,在http里面加上
upstream myserver {
//这里面是负载均衡服务器的列表;
}
②然后把server里的server_name改成域名或者ip,相当于访问这个域名的这个端口,就负载均衡平均分配给上面配置的负载均衡服务器列表。
③把location里加上 proxy_pass=http://myserver;

image.png

4.亲测结果

  • 最好用Edge测试,用google可能缓存原因吧,一直不变。
  • 我这里做了host映射,所以可以直接访问www.123.com相当于访问192.168.186.128
  • 地址不变,刷新,发现8080一次,8081一次,以此类推,负载均衡成功!!!


    image.png

    image.png

5.nginx分配服务器的策略
①轮询(默认策略)
每个请求按照时间顺序注意分配到后端服务器,如果后端服务器down掉,能够自动剔除。
②weight 权重策略
weight权重默认为1 权重越高,分配的客户端请求越多。

upstream myserver {
        server    192.168.186.128:8080    weight=5;
        server    192.168.186.128:8081    weight=10;  #权重高于上面8080的,所以分配的请求也多一倍
}

③ip_hash
每个请求按照用户的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享问题。

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

④fair (第三方方式)
按照后端服务器的响应时间分配,响应时间越短,优先分配。

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

Nginx配置实例-动静分离

1.什么是动静分离?
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;


    捕获.PNG
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

  • 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

2.准备工作
(1)在Linux系统中创建静态资源,用于进行访问
根目录 / 下创建data文件夹,下面创建www文件夹存放a.html,image文件夹存放01.jpg文件。

/data/www/a.html
/data/image/01.jpg

(2)实现的效果,不使用tomcat,通过nginx配置访问静态资源。
(3)nginx的配置


image.png

3.亲测效果

  • 如下图所示:访问192.168.186.128/image把下面的目录都列出来了就是这句配置起的作用。
autoindex    on;
image.png
  • 访问192.168.186.128/image/01.jpg


    image.png
  • 访问192.168.186.128/www/a.html


    image.png
  • 如果加expires 参数也是加在location里面

location  /image/ {
        root   /data/;
        autoindex    on;
        expires     3d; //3天缓存过期时间
}

Nginx配置实例-高可用

1.什么是高可用?

image.png

(1)需要两台nginx服务器(我这里两台服务器的ip是192.168.8.128和192.168.8.129
(2)需要keepalived相当于路由检测nginx服务器是否可以正常工作。
(3)需要虚拟ip绑定主从两台nginx服务器,用户访问的是虚拟ip。

2.准备工作
(1)需要两台服务器
(2)在两台服务器安装nginx

(3)在两台服务器安装keepalived
3.两台服务器都安装keepalived

yum install -y keepalived
  • yum安装keepalived的默认安装目录是
/etc/keepalived/keepalived.conf

4.完成高可用的主从配置
(1)两台服务器都修改/etc/keepalived/keepalived.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.8.128  #******************************************
  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  #网卡     ipconfig查看    *********************************************
  virtual_router_id 51   # 主、备机的 virtual_router_id 必须相同     
  priority 100     # 主、从机取不同的优先级,主机值较大,备份机值较小     ************************
  advert_int 1     
  authentication {         
    auth_type PASS         
    auth_pass 1111     
  }     
  virtual_ipaddress {         
    192.168.17.50 # VRRP H 虚拟地址     
  } 
}

(2)两台服务器都在/usr/local/src中添加一个脚本文件nginx_check.sh内容如下
这个脚本就是检查nginx是否正常运行的脚本

#!/bin/bash
A=`ps -C nginx �Cno-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

(3)把两台服务器的nginx和keepalived都启动起来。
keepalived的启动命令:

systemctl start keepalived.service

5.亲测效果
(1)在浏览器中输入设置的虚拟ip看是否能访问,我这里设置的是192.168.8.50
发现可以访问到nginx的欢迎页面,通过ip a这个命令可以看到如下图,已经绑定了这个虚拟ip.

image.png

访问这个虚拟ip192.168.8.50进入nginx主页
image.png

(2)把主服务器192.168.8.128的nginx和keepalived停止

systemctl stop keepalived.service  //停止keepalived
./nginx -s stop   //停止nginx必须在nginx的sbin目录下执行
ps -ef | grep nginx //查看是否停掉了
ps -ef | grep keepalived

kill -9 PID //如果没停掉则用进程号停掉

(3)停掉主服务器后会自动切换到从服务器的nginx
继续访问192.168.8.50还是能访问到nginx主页


image.png

配置文件详解

#全局定义
global_defs {   
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }    
  notification_email_from Alexandre.Cassen@firewall.loc    
  smtp_server 192.168.8.128  
  smtp_connect_timeout 30    
  router_id LVS_DEVEL    #最重要是这个LVS_DEVEL能访问到主机,
                                          #因为在hosts文件中配置了127.0.0.1   LVS_DEVEL
}   
#脚本文件
vrrp_script chk_http_port {      
  script "/usr/local/src/nginx_check.sh"      
  interval 2      #(检测脚本执行的间隔)      
  weight -20   #设置当前服务器的权重,当主服务器挂掉权重降低20,也就是自动切换到从服务器
}   
#虚拟ip设置
vrrp_instance VI_1 {     
  state MASTER   # 主服务器为 MASTER 从服务器为 BACKUP       
  interface ens33  #网卡     
  virtual_router_id 51   # 主、备机的 virtual_router_id 必须相同     
  priority 100     # 主、从机取不同的优先级,主机值较大,备份机值较小     
  advert_int 1     #每隔一秒发送心跳,判断主机是否活着
  authentication {      #校验方式   
    auth_type PASS         
    auth_pass 1111     
  }     
  virtual_ipaddress {         
    192.168.17.50 # VRRP H 虚拟地址     可以绑定多个
  } 
}

Nginx的基本原理

1.master和worker

image.png

  • 可以通过查看进程ps -ef | grep nginx看到如下图所示:
    matser相当于领导:分配任务
    worker相当于工人:执行领导分配的任务


    image.png

2.worker如何进行工作的

image.png

  • 当master有任务了,由多个worker的争抢机制来得到任务。

3.一个master多个worker这种机制的好处
(1)可以使用./nginx -s reload 热部署,不用停止nginx更新配置,当worker抢到任务继续执行,执行完才更新配置,其他没有任务的收到./nginx -s reload命令直接更新配置。
(2)每个worker都是一个独立的进程,所以不需要加锁,省掉了加锁带来的开销。一个worker挂掉了,其他的worker会正常工作,继续进行争抢,降低了服务中断的风险。

4.设置多少个worker合适?

Nginx和redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,即使上千万个请求也不在话下,每个worker的线程可以把CPU的性能发挥到极致。所以worker数量和CPU核心数相等时最为适宜的,设置少了浪费CPU,设置多了会造成CPU频繁切换上下文造成损耗。

  • 因为windows中没有了io多路复用机制,所以功能虽然能实现,但是性能不能发挥极致,所以一般nginx和redis都是安装到Linux中。

5.连接数worker_connection
(1)发送一个请求占用worker几个连接数?

  • 两个或四个。
  • 因为如果只访问静态资源就两个连接(往返),如果是动态资源worker还需要访问tomcat,又一个往返。

(2)nginx中有1个master,4个worker,每个worker支持最大连接数1024,所以问支持的最大并发数是多少?

  • 普通的静态访问最大并发数是: worker_connections * worker_processes /2,
  • 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 一、Nginx简介 1.什么是Nginx Nginx(engine x)是一个高性能的HTTP和反向代理服务,Ni...
    青年心路阅读 305评论 0 0
  • 1.什么是负载均衡?通过某种负载分担技术,将外部发送来的请求按照某种策略分配到服务器集合的某一台服务器上,而接收到...
    少艾_91df阅读 482评论 0 0
  • 1. 概念 Nginx (engine x) 是一个高性能的web服务器,同时也提供了IMAP/POP3/SMTP...
    周涛_913d阅读 671评论 0 0
  • Nginx 介绍 Nginx是一款高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代...
    专职跑龙套阅读 264评论 0 0
  • 今天,我们来到了宁海新装修好的房子,我要去学而乐学奥数,可是爸爸要送奶奶去医院检查,我便自告奋勇的说:“我...
    陈耿毅阅读 306评论 0 1