nginx

143 阅读23分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

什么是Nginx

1、Nginx和Apache一样是个Web服务器软件。Nginx由c语言来发的高性能的http服务器以及反向代理服务器 及电子邮件(IMAP/POP3)代理服务器。 由俄罗斯的程序设计师Igor Sysoev所开发, Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验。官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

2、懂得Apache的,应该很能容易理解Nginx,它们是同一类的Web软件,但是既然由了Apache之后又出来个Nginx,那就说明二者各有有缺点:

Nginx VS Apache:

同样点:

1、都是HTTPserver软件

2、功能上都採用模块化结构设计

3、都支持通用的语言接口。如PHP、Perl、Python等

4、支持正向、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输

不同点:

1、Apache处理速度非常慢。占用非常多内存资源

2、功能上,Apache全部模块支持动静态编译,Nginx模块都是静态编译的

3、对Fcgi的支持:Apache支持的非常不好,Nginx支持非常好

4、处理连接方式:Nginx支持epoll,Apache不支持

5、空间使用上:Nginx安装包仅几百K

Nginx的优势

(1)、作为Webserver,Nginx处理静态文件、索引文件,自己主动索引的效率很高

(2)、作为代理server,Nginx能够实现无缓存的反向代理加速,提高站点执行速度

(3)、作为负载均衡server,Nginx既能够在内部直接支持Rails和PHP。也能够支持HTTP代理server对外进行 服务,同一时候还支持简单的容错和利用算法进行负载均衡

(4)、在性能方面,Nginx是专门为性能优化而开发的。实现上非常注重效率。

它採用内核Poll模型。能够支持很多其它的并发连接。最大能够支持对5万个并发连接数的响应,并且仅仅占 用非常低的内存资源

(5)、在稳定性方面,Nginx採取了分阶段资源分配技术,使得CPU与内存的占用率很低。Nginx官方表示。 Nginx 保持1万个没有活动的连接,而这些连接仅仅占用2.5MB内存,因此,类似DOS这种攻击对Nginx来 说基本上是 没有不论什么作用的

(6)、在高可用性方面,Nginx支持热部署,启动速度特别迅速。因此能够在不间断服务的情况下。对软件版 本号 或者配置进行升级,即使执行数月也无需又一次启动,差点儿能够做到7x24小时不间断地执行

如何学习Nginx

1、安装

2、前面也说到,Nginx有三大功能:

反向代理

负载均衡

动静分离

所以学习Nginx也就是学习这三大功能的概念、原理、以及如何配置

安装Nginx

Nginx安装,可以是Yum安装,也可以是源码安装。

但是需要注意,Yum安装和源码包安装Nginx之后是有区别的,比如:网站首页的目录,主配置文件的目录...都不一样,下面会说到。

关闭防火墙,iptables,selinux

还是老规矩,在做关于Web访问,端口访问的实验时,需要关闭防火墙,iptables,selinux等安全措施,以免影响实验效果

#关闭防火墙
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# systemctl disable firewalld
#清空iptables规则
[root@node2 ~]# iptables -F
[root@node2 ~]# iptables -X
[root@node2 ~]# iptables -Z
[root@node2 ~]# /usr/sbin/iptables-save 
#关闭selinux
[root@node2 ~]# setenforce 0
[root@node2 ~]# getenforce 
Permissive

Yum安装Nginx

Nginx的安装不同于Apache,本地磁盘镜像没有Nginx的包,系统自带的Base仓库源也没有Nginx包,我们可以用阿里云镜像的Epel源去Nginx安装

1、进入阿里云镜像网站

developer.aliyun.com/mirror/

image.png

image.png

[root@node2 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@node2 ~]# cd /etc/yum.repos.d/
[root@node2 yum.repos.d]# ll
total 40
-rw-r--r--. 1 root root 1664 Apr 28  2018 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Apr 28  2018 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Apr 28  2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Apr 28  2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Apr 28  2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Apr 28  2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 Apr 28  2018 CentOS-Vault.repo
-rw-r--r--. 1 root root 2081 Sep 17 03:57 docker-ce.repo
-rw-r--r--. 1 root root  664 Dec 26  2020 epel.repo              #可以看到多个epel.repo

2、安装Nginx

[root@node2 yum.repos.d]# yum install -y nginx

3、启动服务并测试

[root@node2 yum.repos.d]# systemctl restart nginx
[root@node2 yum.repos.d]# systemctl enable nginx

浏览器测试:

image.png

在前面说到Yum安装和源码包安装Nginx又得文件存放的目录是不一样得,

再次说明Yum安装的几个重要的文件

/usr/share/nginx/html/                #Nginx的网页文件所在的路径
/etc/nginx/nginx.conf                 #Nginx的主配置文件

4、改变网页内容,并测试

[root@node2 ~]# cd /usr/share/nginx/html/
[root@node2 html]# ll
total 12
-rw-r--r--. 1 root root 3650 Oct 18 19:55 404.html
-rw-r--r--. 1 root root 3693 Oct 18 19:55 50x.html
lrwxrwxrwx. 1 root root   20 Jan 15 06:56 en-US -> ../../doc/HTML/en-US
drwxr-xr-x. 2 root root   27 Jan 15 06:56 icons
lrwxrwxrwx. 1 root root   18 Jan 15 06:56 img -> ../../doc/HTML/img
lrwxrwxrwx. 1 root root   25 Jan 15 06:56 index.html -> ../../doc/HTML/index.html
-rw-r--r--. 1 root root  368 Oct 18 19:55 nginx-logo.png
lrwxrwxrwx. 1 root root   14 Jan 15 06:56 poweredby.png -> nginx-logo.png
[root@node2 html]# rm -rf ./*
[root@node2 html]# echo "Hello Nginx" >> index.html

浏览器测试

image.png

至此Yum安装Nginx完成

源码包安装Nginx

前面说到Nginx是由c语言编写的,因此我们在编译时需要gcc的包

1、下载Nginx源码包,选择1.19.1版本即可

网站:nginx.org/download/

image.png

[root@node2 ~]# wget http://nginx.org/download/nginx-1.19.1.tar.gz
#如果虚拟机不支持访问外网,那先把包下载到windows中,在传到Linux中

2、解压,编译,

#解压
[root@node2 ~]# tar xzvf nginx-1.19.1.tar.gz 
#安装编译Nginx所需要的工具包
[root@node2 ~]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
[root@node2 ~]# cd nginx-1.19.1
[root@node2 nginx-1.19.1]# ./configure           #进行编译,在这里可以通过--prefix=目录路径来指定关于Nginx相关的文件安装到具体的目录中,如果不加--prefix=参数,默认安装到/usr/local/nginx/目录下
[root@node2 nginx-1.19.1]# make && make install  #安装

说明源码包安装Nginx,的网页文件和主配置文件所在的目录

[root@node2 ~]# cd /usr/local/nginx/
[root@node2 nginx]# ll
total 4
drwxr-xr-x. 2 root root 4096 Jan 15 07:15 conf
drwxr-xr-x. 2 root root   40 Jan 15 07:15 html
drwxr-xr-x. 2 root root    6 Jan 15 07:15 logs
drwxr-xr-x. 2 root root   19 Jan 15 07:15 sbin
/usr/local/nginx/html         #网页目录
/usr/local/nginx/conf/nginx.conf     #主配置文件

3、启动Nginx,并浏览器测试

image.png

至此源码包安装Nginx完成

如何选择Nginx的安装方式

虽然说Yum的方式Nginx简单,但是Yum的方式,最终的主配置文件的配置简单,如果想添加需求,还需要自己动手添加相应的代码,比如说搭建wordpress时的PHP的配置就需要自己动手添加。

那相对来说源码包安装的主配置文件的内容较多,在添加需求时,不必要自己动手添加,只需要使用自带的内容即可。

Nginx常用命令

注意:以下命令都需要在/usr/local/nginx/sbin中使用才会有效

#查看Nginx版本
[root@node2 sbin]# ./nginx -v
nginx version: nginx/1.19.1
#启动Nginx
[root@node2 sbin]# ./nginx 
#关闭Nginx
[root@node2 sbin]# ./nginx -s stop
#重新加载Nginx(需要在nginx启动的情况下进行该操作)
[root@node2 sbin]# ./nginx -s reload

Nginx的主配置文件解读

前面Nginx已经安装完成,想学习Nginx掌握这些还远远不够,无论学习那些服务都需要从服务的主配置文件入手

因此来看看Nginx的主配置文件

[root@node2 ~]# vi /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;           #Nginx,work子线程的数量,后面会说到#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;
​
​
events {
    worker_connections  1024;     #Nginx的连接数
}
​
​
http {           #http模块,是Nginx服务器配置中最为频繁的部分,代理,缓存和日志定义的大多数功能和第三方模块的配置都在这里。http模块又分为两块:httpd全局模块,server块
    include       mime.types;
    default_type  application/octet-stream;
​
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
​
    #access_log  logs/access.log  main;
​
    sendfile        on;
    #tcp_nopush     on;
​
    #keepalive_timeout  0;
    keepalive_timeout  65;
​
    #gzip  on;
​
    server {                #server模块,是Nginx配置最核心的板块,http模块中可以包含多个server模块,每一个server模块就是个虚拟主机,
        listen       80;    #Nginx服务监听端口和Apache一样
        server_name  localhost;     #服务器所在的地址
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {         #location块主要作用是基于Nginx服务器接收到的请求字符串进行匹配
            root   html;
            index  index.html index.htm;
        }
​
        #error_page  404              /404.html;
​
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
​
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
​
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
​
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }
​
​
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
​
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
​
​
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
​
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
​
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
​
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
​
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
​
}

总结如下:

Nginx配置文件由三部分组成:

1、全局块

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

image.png 2、events

event块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取那种事件驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等

默认配置文件就表示每个work process支持的最大连接数为1024

这部分对Nginx的性能影响较大,在实际中应该灵活配置

3、http块

是Nginx中配置最为频繁的部分,比如:代理,负载均衡,动静分离,缓存,日志等大部分功能和第三方模块

http板块包括:http全局模块,server模块

image.png

4、server模块又分为:server全局模块,location块

server全局模块就是上述所示

location模块:

image.png

location模块指令

location属于server模块中的核心,自然也是整个Nginx配置的核心

Nginx的HTTP配置主要包括三个区块,结构如下:
http { //这个是协议级别
  include mime.types;
  default_type application/octet-stream;
  keepalive_timeout 65;
  gzip on;
    server { //这个是服务器级别
      listen 80;
      server_name localhost;
        location / { //这个是请求级别
          root html;
          index index.html index.htm;
        }
      }
}

location区段

通过指定模式来与客户端请求的URI相匹配,基本语法如下:location [=||*|^~|@] pattern{……}

1、没有修饰符 表示:必须以指定模式开始,如:

复制代码

server {
  server_name baidu.com;
  location /abc {
    ……
  }
}
那么,如下是对的:
http://baidu.com/abc
http://baidu.com/abc?p1
http://baidu.com/abc/
http://baidu.com/abcde

2、=表示:必须与指定的模式精确匹配

复制代码

server {
server_name sish
  location = /abc {
    ……
  }
}
那么,如下是对的:
http://baidu.com/abc
http://baidu.com/abc?p1
如下是错的:
http://baidu.com/abc/
http://baidu.com/abcde

3、~ 表示:指定的正则表达式要区分大小写

复制代码

server {
server_name baidu.com;
  location ~ ^/abc$ {
    ……
  }
}
那么,如下是对的:
http://baidu.com/abc
http://baidu.com/abc?p1=11&p2=22
如下是错的:
http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde

4、~* 表示:指定的正则表达式不区分大小写

复制代码

server {
server_name baidu.com;
location ~* ^/abc$ {
    ……
  }
}
那么,如下是对的:
http://baidu.com/abc
http://baidu..com/ABC
http://baidu..com/abc?p1=11&p2=22
如下是错的:
http://baidu..com/abc/
http://baidu..com/abcde

5、^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配, 那么就停止搜索其他模式了。 6、@ :定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请 求来访问,如try_files或error_page等

查找顺序和优先级 1:带有“=“的精确匹配优先 2:没有修饰符的精确匹配 3:正则表达式按照他们在配置文件中定义的顺序 4:带有“^”修饰符的,开头匹配 5:带有“” 或“~*” 修饰符的,如果正则表达式与URI匹配 6:没有修饰符的,如果指定字符串与URI开头匹配

root 、alias指令区别

location /img/ {
    alias /var/www/image/;
}
#若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ {
    root /var/www/image;
}
#若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。] 

alias是一个目录别名的定义,root则是最上层目录的定义。

还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无

1. =: 用于不含正则表达式的uri,要求请求的字符串要和uri严格匹配,如果匹配成功就停止向下搜索并立即处理请求
2. ~: 用于表示uri包含正则表达式,并且区分大小写
3. ~*: 用于表示uri包含正则表达式,并且不区分大小写
   注意:如果uri包含正则表达式,则必须要有~或者~*标识

反向代理

在学会如何安装Nginx,理解Nginx的各个配置后,我们就需要针对设置各种各样的配置,来实现各种各样功能

学习Nginx的功能,分两步:清楚原理,动手配置

来第一个功能:反向代理

什么是反向代理

1、在学习反向代理之前,先来说说正向代理

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet, 则需要通过代理服务器来访问,这种代理服务就称为正向代理。

image.png

总结:正向代理就是在客户端(浏览器)中配置代理服务器,通过代理服务器进行互联网访问,这区别与反向代理 ,反向代理是直接部署一个nginx反向服务器,不是在客户端(浏览器)配置代理服务器

2、反向代理

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

image.png

总结:反向代理:不需要在客户端(浏览器)配置代理服务器,直接部署nginx反向代理服务器,其中代理服务器和目标服务器对外就是一个服务器,但是对外暴露的是反向代理的服务器,比如:用户在去访问8001的端口,会先交给9001端口

实验配置

反向代理(一)

  1. 实现效果

    代开浏览器,输入www.123.com,跳转到linux系统中Tomcat主页

    这个域名需要在windows上做域名解析

  2. 准备工作:

    安装Java环境,Tomcat,

  3. Tomcat环境的准备:

    下载安装包

    解压:

    tar xzvf apache-tomcat-7.0.109.tar.gz  -C /usr/local/    ###解压安装包
    mv apache-tomcat-7.0.109/ tomcat   ###换个名字
    

    启动:

    /usr/local/tomcat8080/bin/startup.sh      ./startup.sh
    

    如果需要改动Tomcat的网页内容,在:

    /usr/local/tomcat8080/webapps/ROOT/index.jsp
    ######只需要删除里面的全部内容,然后添加自己的内容即可
    想要使用自己的网页,还有另外一种方法:
    直接在/usr/local/tomcat8080/webapps目录下,创建vod目录(这个目录可以随意创建),然后进入到目录创建个.html文件,编辑.html,写上自己想要显示的内容即可
    [root@node2 webapps]# mkdir vod
    [root@node2 webapps]# cd vod/
    [root@node2 vod]# ll
    total 0
    [root@node2 vod]# vi b.html
    I am bo!!!
    然后在浏览器中访问,需要奸商目录的uri
    

    如图:

image.png

  1. 修改Nginx的配置文件

    server {
            listen       80;
            server_name  localhost;
    ​
            #charset koi8-r;
    ​
            #access_log  logs/host.access.log  main;
    ​
            location / {
                proxy_pass http://192.168.9.130:8080;    ######添加这一行
                root   html;
                index  index.html index.htm;
            }
    ​
            #error_page  404              /404.html;
    ​
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    ​
    

    反向代理(二)

    1. 实现效果:

      在浏览器中访问 192.168.9.130:9001/edu,页面请求会转到Tomcat的8080端口页面

      在浏览器中访问 192.168.9.130:9001/vod,页面请求会转到Tomcat的8081端口页面

    2. 准备工作:

      安装Nginx,安装java,安装Tomcat

      由于是在访问Tomcat的8080,8081端口,

      所以需要在本机安装两个Tomcat,在其中以各Tomcat的配置文件中改动端口即可

    3. 安装Tomcat的过程:

      创建tomcat8080,和tomcat8081目录,将Tomcat解压进去

      tar xzvf /root/apache-tomcat-7.0.109.tar.gz  -C /usr/local/tomcat8080/
      tar xzvf /root/apache-tomcat-7.0.109.tar.gz  -C /usr/local/tomcat8081/
      

      进入到tomcat8080目录中的webapps目录:

      [root@node1 tomcat8080]# cd webapps/
      [root@node1 webapps]# ll
      total 4
      drwxr-x---. 14 root root 4096 Nov  9 19:58 docs
      drwxr-xr-x.  2 root root   20 Nov  9 20:12 edu
      drwxr-x---.  7 root root  111 Nov  9 19:58 examples
      drwxr-x---.  5 root root   68 Nov  9 19:58 host-manager
      drwxr-x---.  5 root root  103 Nov  9 19:58 manager
      drwxr-x---.  3 root root  283 Nov  9 19:58 ROOT
      [root@node1 webapps]# pwd
      /usr/local/tomcat8080/webapps
      ######创建个edu目录,并且写入网页文件:
      [root@node1 webapps]# cd edu/
      [root@node1 edu]# cat a.html 
      8080!!!
      

      然后启动:

      /usr/local/tomcat8080/bin/startup.sh      ./startup.sh
      

      tomcat8081目录一样的操作,但是tomcat8081需要编辑配置文件,来改变端口:

      [root@node1 conf]# cd /usr/local/tomcat8081/apache-tomcat-7.0.109/conf/ #进入配置目录
      #修改server.xml文件
      [root@node1 conf]# vim server.xml 
      ...
      <Server port="8015" shutdown="SHUTDOWN">    ######由8005端口改为8015端口
      ...
      <Connector port="8081" protocol="HTTP/1.1"     ######由8080端口改为8081端口
                     connectionTimeout="20000"
                     redirectPort="8443" />
      ...
      <Connector protocol="AJP/1.3"
                     address="::1"
                     port="8019"          ######由原来的8009改为8019端口
                     redirectPort="8443" />
          -->
      #改完之后,:wq即可
      #然后启动:
      /usr/local/tomcat8080/bin/startup.sh      ./startup.sh
      
    4. 配置Nginx,修改配置文件:

      [root@node1 conf]# cd /usr/local/nginx/conf/
      [root@node1 conf]# vim nginx.conf
      server {
              listen       9001;
              server_name  192.168.9.130;
      ​
              location / {
                  proxy_pass http://192.168.9.131:8080;
                  root   html;
                  index  index.html index.htm;
              }
              location ~ /edu/ {          #配置网址路径有/edu的服务器
                  proxy_pass http://192.168.9.130:8080;
              }
              location ~ /vod/ {          #配置网址路径有/vod的服务器
                  proxy_pass http://192.168.9.130:8081;
              }
          }
      ######以上的server是新创建的
      改变listen,和server_name
      注意看location模块,后面的路径,它表示:当访问的网址有这个目录时,就使用此location模块
      并且访问Nginx的ip,会被代理到此模块中的路径
      
    5. 访问Nginx---192.168.9.130

      /edu/目录

image.png

    /vod/目录:

image.png

0.  关于location模块的简介:

    可以看到这里配置location时前面有个"~"

    ```
    1. =: 用于不含正则表达式的uri,要求请求的字符串要和uri严格匹配,如果匹配成功就停止向下搜索并立即处理请求
    2. ~: 用于表示uri包含正则表达式,并且区分大小写
    3. ~*: 用于表示uri包含正则表达式,并且不区分大小写
    注意:如果uri包含正则表达式,则必须要有~或者~*标识
    ```

负载均衡

概念

学过集群的都知道,它其实和集群种的负载均衡一样,只不过应用到了Nginx种,就是把单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

image.png

总结:客户端发送请求,会首先经过反向代理服务器,有反向代理服务器,平均分配到各个目标服务器上

实验配置

  1. 实现效果,在浏览器中输入192.168.9.130:9001/edu/a.html,每刷新一次就会出现新的页面效果

  2. 实验准备:安装Nginx,Java,Tomcat,这里Tomcat依然采用一个主机安装两个Tomcat的方法

    在/usr/local/新建目录tomcat8080 ,tomcat8081

    分别在Tomcat8080的/usr/local/tomcat8080/webapps,新建edu目录,并且在目录里面创建a.html文件

    Tomcat8081的/usr/local/tomcat8081/webapps,新建edu目录,并且在目录里面创建a.html文件

    8081的a.html内容:

    [root@node1 edu]# cat a.html 
    8080!!!
    

    8081的a.html内容:

    [root@node1 edu]# cat a.html 
    8081!!!
    
  3. 修改Nginx的配置文件

    upstream myserver{       #转到此处根据定义的内容,进行转发网络请求
            server 192.168.9.130:8080;
            server 192.168.9.130:8081;
        }
    ​
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        server {
            listen       9001;     使用的9001端口
            server_name  localhost;
    ​
            location / {
                proxy_pass http://myserver;       #代理此处指定myserver的upstream
                root   html;
                index  index.html index.htm;
            }
        }
    

    然后重启Nginx,浏览器访问即可

    Nginx负载均衡提供的几种分配方式

    1. 在Linux中又Nginx,LVS,Harproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略)

      (1)轮询(默认)

      每一个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机则自动剔除

      (2)weight

      代表权重,默认为1,权重越高分配的客户端就越多

      upstream myserver{
              server 192.168.9.130:8080 weight 5;
              server 192.168.9.130:8081 weight 10;
          }
      

      (3)ip_hash

      每个请求访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,

      upstream myserver{
              ip_hash;
              server 192.168.9.130:8080;
              server 192.168.9.130:8081;          
          }
      
      (4)fair(第三方)
            
          按后端服务器的响应时间来分配,响应时间短的优先分配
            
            ```shell
            upstream myserver{
                    server 192.168.9.130:8080;
                    server 192.168.9.130:8081;
                    fair;
                }
            ######注意:fair模块默认Nginx是没有的,需要自己下载
      

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力,也就是所是将动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态网页。注意:动静分离的核心含义:是将动静态请求分开,而不是简单的把动静态资源分开。因此动静分离有两种实现方案

动静分离实现由两种方案:

  1. 第一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
  2. 另一种方法就是动态和静态文件混和在一起,然后通过Nginx来分开

那如何通过配置文件实现呢?

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

那何为静态资源,动态资源?

静态资源:可以理解为前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序 处理,直接就能够显示的页面,如果想修改内容则必须修改页面,但是访问效率相当高。 动态资源:需要程序处理或者从数据库中读数据,能够根据不同的条件在页面显示不同的数据,内容更新不需要修 改页面但是访问速度不及静态页面。

image.png

总结:动静分离,就是把网页的动态资源和静态资源分别部署到不同的服务器上,然后通过Nginx反向代理服务指向不同的服务器去访问

实验配置

1、准备静态资源

在/data目录下,创建两个目录:/www,/image,用来存放静态网页个图片的

[root@node1 ~]# mkdir /data
[root@node1 ~]# cd /data/
[root@node1 data]# mkdir www
[root@node1 data]# mkdir image
[root@node1 data]# cd www/
[root@node1 www]# echo "test html" >> a.html
[root@node1 ~]# ll /data/image/
total 128
-rw-r--r--. 1 root root 130798 Jan 16 22:35 a.png

2、编辑配置文件

[root@node1 ~]# vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /www/ {                    #添加两个location,从这里开始
            root /data/;
            index index.html index.htm;
        }
        location /image/ {
            root /data/;
            autoindex on;
        }                                   #到这里结束

3、浏览器测试

可以看到这里的网页以列表的形式呈现出来,这是因为我们添加autoindex on;参数的原因

这个是图片的测试

image.png

html的测试

image.png

Nginx原理

前面在说到配置文件的全局模块时,说到work进程以及work process和worker_connections,下面在详细说说

Master&Work

  1. Nginx开启之后在Linux系统中是有两个进程的:Master和Work

image.png 查看进程:

可以看到有两个进程,master,work

[root@node2 keepalived]# ps -ef |grep nginx
root       1431      1  0 03:04 ?        00:00:00 nginx: master process ./nginx
nobody     1432   1431  0 03:04 ?        00:00:00 nginx: worker process
root       4148   1310  0 04:23 pts/0    00:00:00 grep --color=auto nginx

在配置文件中可以设置worker_processes ?;

Master和Work之间的工作关系

image.png

当客户端发送过来的请求,Master会将请求通知给下面的Work,work不知轮询,也不是计算,是直接“争抢”的去接受请求,

  • 采用一个Master和多个Work的好处?
./nginx -s reload ######热部署方式,更好的使Nginx来热部署任务

什么意思呢?加入现在有四个work进程,其中一个已经接收到请求,正在处理,这时使用上面的命令

在重启进程时,不会重启有任务的那个work进程,其实重启其余三个work

  • 每一个work进程都是独立的,其中一个work出错,不影响其它三个work

work数量设置多少为好?以及如何设置?

每一个work进程中都会有一个主进程,通过异步非阻塞的方式来处理请求,每一个work的线程可以把一个cpu的性能发挥到极致,所以work的数量和cpu数量相等最好,设少浪费,设多会带来cpu繁忙

设置work数量:

直接在Nginx的配置文件中修改如下字段:

worker_processes  2;

work连接数

  1. work默认连接数是1024

    events {
        worker_connections  1024;
    }
    
  • 问题一:当处理一个请求,workhi有几个连接数?

    2/4

    如果是2个,那说明客户端访问的是本地资源,客户端连接到work,work从本地找到数据,在连接客户端并发送

    如果是4个,那说明客户端访问的数据经过Nginx反向代理了,work指向了后端代理的服务器

  • 问题二:Nginx有一个Master,4个Work,每个work支持最大连接数是1024,那么支持的最大并发数有多少?

    如果接收的请求是本地资源:work_connections*work_processes/2

    如果接受的请求需要反向代理:work_connections*work_processes/4

关于以后的Nginx学习

前面就是Nginx最基本的用法,以后深入学习:

参考Nginx管网:nginx.org/en/docs/