nginx的使用

nignx的内容介绍

Nginx基本概念

 - 什么是Nginx?做什么事情?
 - 反向代理
 - 负责均衡
 - 动静分离

Nginx的安装、常用命令、配置文件

  • 在Linux中安装Nginx
  • Nginx的常用命令
  • Nginx配置文件

Nginx配置实例

  • 反向代理
  • 负责均衡
  • 动静分离
  • 高可用集群

Nginx原理

nginx的基本概念

基本概念Nginx (engine x) 是一个高性能的HTTP、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,Nginx是一款轻量级的 Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。

特点:是占有内存少,并发能力强.Nginx专门为性能优化而开发。有报告表明能同时支持50000并发连接数。

反向代理

了解代理之前,先了解什么是代理服务器?

所谓代理服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。

代理服务器的作用:最基本的功能是连接,此外还包括安全性、缓存、内容过滤、访问控制管理等功能

  • 访问无法访问的资源
  • 缓存,提高访问速度
  • 对进入内部网络的Internet信息实施监控和过滤
  • 对客户端访问授权,上网进行认证

正向代理:

概念:如果把局域网外的Internet想象成巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器进行访问,这种代理服务器称为正向代理。
在这里插入图片描述

反向代理:

概念:反向代理其实是客户端对代理是无感知的,因为客户端不需要任何配置就能访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器读取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真是服务器IP地址

在这里插入图片描述

进一步理解:

在这里插入图片描述

反向代理的作用

  • 做内容服务器的替身,保护内容服务器的安全

preview

  • 作为内容服务器的负责均衡器
    在这里插入图片描述

负责均衡

概念负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡分摊到多个操作单元上进行运行。通俗的讲就是:当大量数据访问时,一台服务区无法承受所有的数据量,需要多台服务器同时分摊请求数据量。

负责均衡架构图:

点击查看源网页

动静分离

概念:为了加快网站解析速度,可以把动态页面和静态页面有不同的服务器来解析,加快解析速度,降低原来单点服务器的压力。

nginx的安装

在Linux中安装Nginx之前需要安装依赖:

1.安装pcre依赖

(1)把安装包放在Linux中,自己选择一个目录usr/src/安装

(2)解压压缩文件

(3)进入解压目录后,执行./configure

(4)使用make && make install

(5)安装完成后查看版本号:pcre-config --version

2.安装其他依赖

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

3.安装Nginx

(1)把安装包放在Linux中,自己选择一个目录安装

(2)解压压缩文件(官网找安装包)

(3)进入解压目录后,执行./configure

(4)使用make && make install

注意:如果安装失败,就直接在nginx的文件目录中nignx/objs/Makefile中将前几行中有一个-Werror直接删除

安装成功后,在usr中多出来一个文件夹usr/local/nginx

查看开放的端口号:

firewall-cmd --list-all

设置开放的端口号:

firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent

重启防火墙:

firewall-cmd --reload

nginx的实现原理

nginx的底层实现结构是mater 和 worker的一种关系。如下图:

在这里插入图片描述

master进程接收到处理请求后,会将请求分配给worker进程进行处理,worker进程进行处理并与服务端进行连接。

worker是如何进行工作的呢?

在这里插入图片描述

如图所示,worker的实现方式是一种争抢的实现方式,master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。当一个连接过来的时候,每一个worker都能接收到通知,但是只有一个worker能和这个连接建立关系,其他的worker都会连接失败,这就是所谓的惊群现在,为了解决这个问题,nginx提供一个共享锁accept_mutex,有了这个共享锁后,就会只有一个worker去接收这个连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。本段内容来源

一个 master 和多个 woker 有好处 :

(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作

(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断

注意:worker的数量不是越多越好,因为每个worker都是一个独立的进程,所以worker 数和服务器的 CPU 数相等是最为适宜的。这样可以充分利用CPU的资源。

问:发送请求,占用了 woker 的几个连接数? 答案:2 或者 4 个,和请求之间一来一回,和服务端之间一来一回。

nginx为什么性能高?

答:内部事件处理模型为NIO模型

  • 对于每个worker进程来说都是一个独立的进程,相互之间不会产生影响,同时不需要进行加锁操作,节省了CPU的开销。单个worker出现故障不会影响其他的worker正常工作,降低了风险。
  • nginx的多进程事件处理模型为异步非阻塞的方式处理请求。nginx是可以同时处理成千上万个请求的。一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。本段内容来源

nginx的常用命令

上面安装完nginx后,之后就是使用nginx了。

1.启动nginx:

在/usr/local/nginx/sbin目录下执行 ./nginx

提示:我们安装nginx是在src目录下,local目录中的nginx是自己生成的文件。

启动后,页面是没有反应的,如何知道nginx启动成功了呢?

1.启动./nginx

查看进程信息是否启动:如下,nginx已经启动。

在这里插入图片描述

2.查看配置文件,nginx的默认的访问访问端口:

// 退出sbin目录
cd ..
// 进入到conf目录
cd conf
// 进入配置文件中
vim nginx.conf

在这里插入图片描述

可以看到默认访问端口是80端口。可以通过防火墙查看80端口是否打开

firewall-cmd --list-all

在这里插入图片描述

如果没有打开就通过防火墙开启该端口!

2.打开浏览器访问本机服务器

输入本机地址,显示如下网页,表示nginx成功安装并开启。

在这里插入图片描述

注意上面在http下可以直接访问成功,但是https下就会出现连接失败的问题。

3.关闭命令

  • 在/usr/local/nginx/sbin目录下执行./nginx -s stop

4.重新加载命令(更改文件的情况下)

  • 在/usr/local/nginx/sbin目录下执行./nginx -s reload

5.查看nginx的版本号

  • 在/usr/local/nginx/sbin目录下执行.nginx -v

nginx的配置文件

位置:usr/local/nginx/conf

文件名称:nginx.conf

配置文件的组成

nignx.conf配置文件主要可以分为三个部分:

第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

如:worker_processes 1; 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约

第二部分:events块

比如上面的配置: events {

​ worker_connections 1024 };

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化是否允许同时接收多个网络连接选取哪种事件驱动模型来处理连接请求每个 word process 可以同时支持的最大连接数等
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http 块

这算是 Nginx 服务器配置中最频繁的部分负载均衡、代理、缓存和日志定义等功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http全局块、server 块。

1、http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等

2、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  • 全局 server 块
    最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
  • location 块
    一个 server 块可以配置多个 location 块。
    这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

第三部分结构图就是:

在这里插入图片描述

nignx的配置实例

通过一些反向代理的实例,进一步了解nginx的使用

反向代理实例(一)

实例效果:使用nginx反向代理,实现访问自定义域名www.test1.com 直接跳转到Tomcat主页面

通常情况下,要访问Tomcat必须通过主机地址+8080端口才可以访问,但是这里通过直接访问自定义域名+80端口直接实现跳转。

实例步骤

Tomcat的安装:

1.在usr/src目录下安装一个Tomcat,默认端口8080

2.直接将Tomcat安装包放在usr/src目录下,tar -zxvf xxxx解压安装

3.启动Tomcat:进入到Tomcat的bin目录下,./startup.sh启动Tomcat服务器

在这里插入图片描述

4.8080端口设置:

  • 对外开放访问的端口 firewall-cmd --add-port=8080/tcp --permanent firewall-cmd –reload

  • 查看已经开放的端口号 firewall-cmd --list-all

在这里插入图片描述

5.在Windows系统中通过浏览器访问Tomcat服务器确认安装成功

具体配置:

1.在Windows系统的host文件中进行域名和IP对应关系的配置

在这里插入图片描述

打开文件直接在最后一行添加域名映射关系:115.29.xxx.xxx www.test1.com

2.在nginx配置文件nignx.conf中进行请求转发的配置(反向代理的配置)

server {
        listen       80;
        server_name  115.29.xxx.xxx;  // 这里将localhost改为自己服务器ip

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass  http://127.0.0.1:8080;   // 添加请求转发的地址
            index  index.html index.htm;
        }

3.进行测试

直接在浏览器输入www.test1.com

问题:8080端口被占用

解决步骤:

1.启动Tomcat后,进入logs目录下执行cat catalina.out,就可以知道Tomcat是否启动成功。

2.通过查看日志,我的日志中是出现错误:

在这里插入图片描述

可以看到是8080端口被占用。可以通过修改Tomcat端口解决。但是本人就是不让步!!!!

3.查看是哪个进程占用了8080端口,命令:netstat -anp | grep 8080

查看所有端口占用的情况:netstat -tln

在这里插入图片描述

有LISTED表示被占用,9894表示占用进程的PID,Java表示占用进程的名称。

果然总有刁民想害朕!!!查看端口属于哪个程序?端口被哪个进程占用 lsof -i :8083

4.杀死该进程:kill 9894

5.直接重启Tomcat,并在浏览器访问

反向代理实例(二)

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

  • 访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081

  • 访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082

实现步骤:

1.安装两个不同访问端口的Tomcat

  • 首先在src下创建两个文件分别存放两个相同的Tomcat安装包
  • 分别进行解压安装,此时两个Tomcat都是一样的
  • 分别对两个Tomcat进行端口的配置:配置文件在Tomcat–conf—server.xml,修改配置文件中关闭端口(随便改一个就行)和访问端口(改成8081和8082)。

在这里插入图片描述

在这里插入图片描述

  • 保存修改后的配置文件,启动两个Tomcat

注意:两个端口必须开放!!!

2.在Tomcat的webapps中创建两个用于访问的页面。

3.修改 nginx 的配置文件

在 http 块中添加 server{} 或是在下面的注释掉的server中找一个使用

在这里插入图片描述

如上图进行配置。

location指令说明:用于匹配URL

语法:

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

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

负载均衡实例

什么是负责均衡?

答:就是将大量的请求(负载)分摊到多个操作单元(服务器)上进行执行,作用就是防止大量请求都压在同一个服务器上导致崩溃。

实现的效果:在浏览器中输入相同的访问地址,分别依次访问不同的服务器。

操作步骤:

1.安装两个Tomcat服务器,分别响应不同的端口,例如:8081,8082;

2.分别在两个Tomcat的webapps目录中创建相同的目录和访问页面。例如:/test/a.html

4.在nginx.conf中进行负责均衡的配置:

  • 在server上面添加如下内容:
upstream myserver{                           // 进行负载均衡的配置
              server 115.29.xxx.xxx:8081;    // 负责映射的两个访问路径
              server 115.29.xxx.xxx:8082;

    }
    
server {
        listen       80;
        server_name  115.29.xxx.xxx;          // 进行访问的IP

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass  http://myserver;      // 上面定义的服务的名称
            index  index.html index.htm;
        }

负责均衡的策略:

1.轮询策略(默认):

  • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2.权重(weight)策略:

  • weight 代表权,重默认为 1,权重越高被分配的客户端越多; 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{                                    // 进行负载均衡的配置
              server 115.29.xxx.xxx:8081 weight=1;    // 负责映射的两个访问路径
              server 115.29.xxx.xxx:8082 weight=1;
    }

3.ip_hash策略:

  • 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream myserver{                           // 进行负载均衡的配置
              ip_hash;
              server 115.29.xxx.xxx:8081;    // 负责映射的两个访问路径
              server 115.29.xxx.xxx:8082;
    }

4.fair(第三方):

  • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{                           // 进行负载均衡的配置
              server 115.29.xxx.xxx:8081;    // 负责映射的两个访问路径
              server 115.29.xxx.xxx:8082;
              fair;
    }

动静分离实例

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

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

  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
    通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。

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

实现步骤:

1.准备单独的静态文件夹用于对静态资源的访问:

  • 在根目录下创建一个statics文件夹
  • 在statics文件夹下分别创建两个文件夹image,www,在两个文件夹中分别存放图片和静态页面

2.进行nginx.conf的配置:

server {
        listen       80;
        server_name  115.29.xxx.xxx;          // 进行访问的IP
        
location /www/ {
            root   /data/;
            index  index.html index.htm;
        }     

location /image/ {
            root   /data/;
            autoindex on;     // 将image中的内容进行罗列
        } 

3.启动nginx进行测试:http://115.29.xxx.xxx/www/a.html, http://115.29.xxx.xxx/image/b.jpg,

高可用实例(主从模式)

高可用的原理:
在这里插入图片描述

如图,高可用就是当请求发送到服务端时,正常情况下就是nginx1处理请求然后将请求分发到各个服务器。当nginx1因为故障停止工作后,为了不影响正常的工作。nginx2代替nginx1进行请求的处理工作。从而实现了高可用的状态。

实现方式:keepalived软件进行监听nginx工作状态,如果nginx挂掉,就自动转换nginx服务器。

实现具体过程:

1.需要装备两台服务器分别安装nginx和keepalived

  • 通过yum的安装方式进行keepalived的安装:
yum -y install keepalived

安装成功后,会自动在etc目录中生成一个keepalived的目录,配置集群需要进行keepalived.conf的配置

2.修改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.17.129 
   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 BACKUP           # 备份服务器上将 MASTER 改为 BACKUP       
          interface eth0         # 网卡,通过命令ifconfig查看    
          virtual_router_id 51   # 主、备机的 virtual_router_id 必须相同     
          priority 90            # 主、备机取不同的优先级,主机值较大,备份机值较小 
          advert_int 1           # 心跳检测频率
    authentication {             # 权限验证用的
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress {         192.168.17.50 // VRRP H 虚拟地址 
    } 
} 

3.在/usr/local/src 添加检测名称为nginx_check.sh的脚本:

#!/bin/bash 
A=`ps -C nginx –no-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 

4.把两台服务器上 nginx 和 keepalived 启动:

  • 启动 nginx:./nginx

  • 启动 keepalived:systemctl start keepalived.service

停止keepalived:systemctl stop keepalived.service

还有一种模式是双主模式就是每个nginx服务器既是主节点也是从节点,还是只要在 keepalived配置文件中进行配置即可。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值