Nginx学习笔记

2019-09-20  本文已影响0人  yunqing_71

\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) 三部分组成

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教程*****

/usr/local/tomcat
和
/usr/local/tomcat1
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#############

# OS specific support. $var must be set to either true or false. 

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

export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
<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

在 # 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.准备工作

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

image.png

4.亲测结果

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 处理动态页面。动静分离从目前实现角度来讲大致分为两种:

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.亲测效果

autoindex    on;
image.png
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
/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

2.worker如何进行工作的

image.png

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频繁切换上下文造成损耗。

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

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

上一篇 下一篇

猜你喜欢

热点阅读