Nginx入门

学习目标

  • nginx基础使用
  • nginx主要配置
    • server
    • location
  • 利用nginx的代理转发访问后台java服务
  • nginx限流功能

1. 介绍

Nginx跟Tomcat、Apache一样,也是web服务器软件,但是它更擅长处理像图片、css这样的静态资源
image.png
相对于Apache,Nginx有这些优势:

  • 处理静态资源请求,cpu 内存使用率低
  • 抗并发,在高并发下 Nginx 能保持低资源、低消耗、高性能
  • 配置简洁,并且几乎可以做到 7*24 不间断运行
  • 可以做负载均衡
  • 社区活跃,还有专门的社区网站,https://www.nginx-cn.net/

image.png
Nginx和Apache一些性能上的比较
image.png
image.png
Nginx的市场占有率
image.png

2. 应用场景

image.png

1. 静态资源服务器

Nginx在处理HTML、css、图片等这些静态资源请求的速度是非常快的,根据之前的图片,你也可以了解一二。
重要的是可以把你网站上的动态资源和静态资源分开,这就是动静分离

2. 正向代理

我们平常访问google是不通的,需要花钱买个VPN,通过这个VPN就可以在自己电脑上访问google、youtube这样的网站了。这个VPN就可以说是我们的正向代理服务器。
这时候访问者的身份对google来说是隐藏的
09.jpeg

3. 反向代理

反向代理跟正向代理正好相反,正向代理隐藏的是请求者的身份反向代理隐藏的是服务者的身份
10.jpg
根据上图,请求会先到达这个反向代理服务器,它会把请求在转发到真正服务器,拿到结果后在返回。

再举个通俗的例子,假如你需要钱,但是又不知道谁有钱,所以你找了一个网贷平台,提交资料后,平台把钱打给你,你并不知道也不需要关注,这钱是谁的,从哪里来。平台拿到你贷款的请求后,会在内部去找对应的金主拿钱,拿到钱后再给你。这些金主才是真正的服务者,但是对你而言是隐藏的。
image.png

正向代理,代理的是请求者
对于服务者而言,请求者的身份是隐藏的,一般骇客攻击就会使用这种方式来隐藏自己真实ip地址
反向代理,代理的是服务者
对于请求者而言,服务者的身份是隐藏的,这样就能更加保证服务者的安全性

再给你一张图:11.jpg

4. API服务

13.png
上图表示 Nginx也可以直接连接数据库、redis
应用服务它本身的性能有很多问题,但是数据库服务要比应用服务好的多,因为它的业务场景比较简单,它的并发性能和TPS都要远高于应用服务,所以衍生出这一应用场景——由Nginx直接去访问数据库、redis或应用服务。
简单来说:能在Nginx里写业务代码

3. Windows安装启动

1. 下载

下载地址:http://nginx.org/en/download.html 
image.png

  • Mainline version: Nginx 目前主力在做的版本,可以说是开发版
  • Stable version:    最新稳定版,生产环境上建议使用的版本
  • Legacy versions: 遗留的老版本的稳定版

我们使用稳定的版本,nginx/Windows-1.18.0

2. 安装启动

我下载好后,是个zip压缩包,解压后
image.png
双击nginx.exe文件并没有用,需要在命令行里启动
打开命令行,并切换到ngixn解压目录,输入:nginx.exe 或者 start nginx
如果提示下面的错误,
17.jpg
说明80端口被占用了,Nginx默认监听的是80端口,但是可以修改,找到conf目录下的nginx.conf
image.png
修改红框处,改成8888,再次启动
19.jpg
打开浏览器,输入:localhost:8888,结果应该是这样子的。
17.png
使用 start nginx 这个命令可以后台启动,先执行:nginx -s stop ,把nginx关掉
再次执行 start nginx, 结果:
22.jpg
这样就可以继续输入其他命令了,同时还可以用 tasklist /fi "imagename eq nginx.exe" 来查看nginx是否启动
23.jpg

4. Linux安装启动

1. 基本环境

在安装Nginx之前,需要安装这几个东西

安装编译环境:
安装make:yum -y install autoconf automake make #一般Centos系统都自带,可以用make -help 看一下
安装g++: yum -y install gcc gcc-c++

安装Nginx依赖库:
安装pcre:yum -y install pcre pcre-devel
安装zib:yum -y install zlib zlib-devel
安装openssl:yum install -y openssl openssl-devel

make和g++是编译环境,在linux下安装软件,一般都需要这两个东西
其他的都是Nginx运行需要的依赖库
一般 centos 会自带 make
25.png
26.png27.png
28.png
29.png
30.png31.png

2. 安装

下载地址:http://nginx.org/en/download.html 
http://nginx.org/download/nginx-1.18.0.tar.gz
下载Nginx的Linux版本
25.png
下载完成后传到centos虚拟机里的/usr/local/src目录
32.png
执行:tar -zxvf nginx-1.18.0.tar.gz,结果
33.png
进入nginx-1.18.0目录
34.png
在当前路径下执行这句命令

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

这是对Nginx进行一些配置,看表格

| --prefix=/usr/local/nginx | 指定Nginx安装目录为/usr/local/nginx
可以修改为自己的路径 |
| --- | --- |
| --with-http_stub_status_module | 开启Nginx的监控模块 |
| --with-http_ssl_module | 开启Nginx的https模块 |

最后一步,在当前目录,执行:make && make install
image.png
安装完成后,可以用whereis nginx命令来查看Nginx安装的地址。
36.png
解释一下:

conf 配置文件
html 静态网页文件
logs 日志文件
sbin 二进制程序,是Nginx核心的可执行文件

3. 配置环境变量

跟安装JDK,配置JAVA_HOME一样

[root@localhost nginx]# vi /etc/profile

在最下面加上

export PATH=$PATH:/usr/local/nginx/sbin

保存后,使用source命令使配置生效

[root@localhost nginx]# source /etc/profile

4. 启动

直接输入nginx就可以启动了
38.png
使用 ps -ef | grep nginx ,可以查看是否启动,启动成功后应该是这样子的
39.png
在浏览器中也可以访问
40.png
如果浏览器不显示:
image.png
使用这个命令 **firewall-cmd --state_, 查看一下Centos虚拟机的防火墙是不是正在运行
如果是运行状态
image.png
使用下面命令关掉防火墙就行了

# 关闭防火墙
[root@localhost nginx-1.18.0]# systemctl stop firewalld.service
# 禁止防火墙开机启动
[root@localhost nginx-1.18.0]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

5. 常用的命令

1. 辅助命令

查看Nginx版本信息,注意这是小写的v
[root@localhost nginx]# nginx -v
nginx version: nginx/1.18.0

查看Nginx版本和开启的模块信息,这是大写的V
[root@localhost conf]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

查看Nginx帮助信息
[root@localhost nginx]# nginx -h

2. 启停命令

启动Nginx有2种方式

启动Nginx
[root@localhost nginx]# nginx

使用指定配置文件,启动Nginx,当不想使用默认的配置文件时候,可以用这个命令
[root@localhost nginx]# nginx -c /usr/local/nginx/conf/nginx.conf

可以使用下面这个命令,看是否启动成功

查看Nginx进程,可以判断是否启动成功,同时也可以看到nginx的进程号
[root@localhost nginx]# ps -ef | grep nginx

停止Nginx也有2种方式

暴力停止Nginx
[root@localhost nginx]# nginx -s stop

优雅停止Nginx
[root@localhost nginx]# nginx -s quit

nginx -s quit Nginx在停止前,会完成已经接受的请求,推荐使用
nginx -s stop Nginx快速停止,不管有没有正在处理的请求

3. 配置相关命令

启动Nginx的时候需要载配置文件,没有指定时,使用默认的配置文件
如果修改配置文件,先停止、再启动Nginx,比较麻烦
使用下面命令,不用停止Nginx就可以让修改后的配置生效

重新加载配置文件,不用停止Nginx
[root@localhost nginx]# nginx -s reload

Nginx的配置很复杂的且容易出错,所以修改配置后,一般会使用下面的命令校验是否合法

修改配置文件后先用这个命令校验配置是否合法
[root@localhost nginx]# nginx -t

[root@localhost nginx]# nginx -s reload

6. 基础配置

Nginx默认的配置文件是conf/nginx.conf
结构如下:

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
    }
    ...     #http全局块
}

1. server配置

建议修改nginx.conf之前,先备份
修改 server配置,如下:只修改 server_name、location 中的 index

    server {
        #监听端口
        listen       80;
        #域名,也可以是IP
        server_name  yase.cn;
        #编码识别
        #charset koi8-r;
        #日志格式及日志存放路径
        #access_log  logs/host.access.log  main;

				#location 用于匹配请求路径
        location / {
            #站点根目录,静态资源都可以放到这里,在这里就是:/usr/local/nginx/html
            root   html;
            #首页
            index  yase.html;
        }
        #错误页面
        #error_page  404              /404.html;
    }

修改完后,在命令行执行

修改配置文件后先用这个命令校验配置是否合法
[root@localhost nginx]# nginx -t

重新加载配置文件
[root@localhost nginx]# nginx -s reload

然后在 /usr/local/nginx/html 文件加下增加一个yase.html。至于内容

<CTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>亚瑟</title>
</head>
<body>
	<h1>亚瑟是最强大的英雄</h1>
</body>
</html>
注意:切记在保存html文件的时候一定要用utf-8编码

使用域名访问,改一下本机的host文件,加上
windsow中host:C:\Windows\System32\drivers\etc\hosts

#虚拟机的ip地址
192.168.56.104	yase.cn

修改hosts后,在cmd命令行执行:ipconfig /flushdns
image.png

最后在浏览器输入:yase.cn
image.png
error_page 配置:

# 当Nginx找不到资源时候,就会抛出一个404,
# 如果这时候有error_page, 就会访问指定的资源,在这里就是/404.html
error_page  404              /404.html;

在 /usr/local/nginx/html 文件夹中添加一个404.html

<CTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>亚瑟</title>
</head>
<body>
	<h1>亚瑟提示您:找不到这个页面</h1>
</body>
</html>
注意:切记在保存html文件的时候一定要用utf-8编码

然后访问 yase.cn/asdfklj.html
image.png

2. 虚拟主机

只需要记住一句话,一个server配置,就是一个虚拟主机。
根据之前的配置,再复制出一个 server 配置出来,把server_name和index修改一下

    server {
        #监听端口
        listen       80;
        #域名
        server_name  lvbu.cn;
        #编码识别
        #charset koi8-r;
        #日志格式及日志存放路径
        #access_log  logs/host.access.log  main;

				#location 用于匹配请求路径
        location / {
            #站点根目录,静态资源都可以放到这里,在这里就是:/usr/local/nginx/html
            root   html;
            #首页
            index  lvbu.html;
        }
        #错误页面
        #error_page  404              /404.html;
    }

注意:这两个 server 配置是并列存在,另外:修改配置文件后,一定要重新加载
在 /usr/local/nginx/html 文件夹下增加一个lvbu.html。至于内容

<CTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>吕布</title>
</head>
<body>
	<h1>我的貂蝉,在哪里</h1>
</body>
</html>
注意:切记在保存html文件的时候一定要用utf-8编码

最后把host文件改一下

#虚拟机的ip地址
192.168.0.15	yase.cn lvbu.cn

然后分别访问 yase.cn 和 lvbu.cn
image.png
image.png

总结:通过一个服务器能达到多个网站的访问效果,这就是虚拟主机
注意:每个 server域名(ip)+端口(port) 是唯一的。

3. server配置优化

经过上面的测试,有一些问题:

  • 复制好几个server,导致 nginx.conf 文件很膨胀
  • 其次,所有的网站文件都在 html 这个文件夹下,很混乱

可以优化配置,首先执行下面的命令

[root@localhost nginx]# cd /home
在/home中建立nginx和web文件夹
[root@localhost home]# mkdir nginx web
[root@localhost home]# ll
total 0
drwxr-xr-x. 2 root root 66 Jan 23 13:05 nginx
drwxr-xr-x. 5 root root 51 Jan 23 13:07 web

[root@localhost home]# cd web
建立 yase lvbu 文件夹,然后把 yase.html、lvbu.html 分别复制到对应的文件夹,可以修改一下内容
[root@localhost web]# mkdir yase lvbu

在 /home/nginx 中建 yase.conf 文件,内容:

    server {
        #监听端口
        listen       80;
        #域名
        server_name  yase.cn;
        #编码识别
        #charset koi8-r;
        #日志格式及日志存放路径
        #access_log  logs/host.access.log  main;

				#location 用于匹配请求路径
        location / {
            #站点根目录,静态资源都可以放到这里
            root   /home/web/yase;
            #首页
            index  yase.html;
        }
        #错误页面
        #error_page  404              /404.html;
    }

在 /home/nginx 中建 lvbu.conf 文件,内容:

    server {
        #监听端口
        listen       80;
        #域名
        server_name  lvbu.cn;
        #编码识别
        #charset koi8-r;
        #日志格式及日志存放路径
        #access_log  logs/host.access.log  main;

				#location 用于匹配请求路径
        location / {
            #站点根目录,静态资源都可以放到这里
            root   /home/web/lvbu;
            #首页
            index  lvbu.html;
        }
        #错误页面
        #error_page  404              /404.html;
    }

最后,修改 nginx.conf,删除所有的serve配置,增加:

#导入/home/nginx文件夹中的所有conf文件
include /home/nginx/*.conf;

结果:
image.png
完成后,重新校验并加载配置文件,使用 nginx -t 和 nginx -s reload
然后浏览器上访问
image.png
image.png

4. location

使用location配置可以实现网站资源的动静分离。但是这个匹配规则可是有些复杂,
体验:
切换到 /home/web/yase 目录,新增一个html页面
image.png

<CTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <title>亚瑟</title>
    </head>
    <body>
      <h1>亚瑟一技能可以穿墙</h1>
    </body>
  </html>
注意:切记在保存html文件的时候一定要用utf-8编码

这时候访问:http://yase.cn/one.html,结果是正常的
image.png
修改yase.conf
image.png
注意:这时候留两个 location,分别指向不同的路径
再次访问:http://yase.cn/one.html
image.png
这是因为不同的 location 配置有不同的优先级,报告404说明第一个 location 的优先级比较高

1. 表达式类型

location的表达式按照优先级分为4种类型,从高到低,依次是:
A. 等号类型(=) :精确匹配,也就是完全匹配,优先级最高,一旦匹配成功,直接返回。

   # 等号类型(=) :精确匹配,一旦匹配成功,不再匹配其他location。
   location = /a.html {#这里表示仅仅匹配 "/a.html" 
   			......
    }

B. ^~ 类型:前缀匹配。

   # ^~ 类型:前缀匹配
   location ^~ /images/ {#这里表示匹配所有以 /images/ 开头的请求。
   		......
    }
   # 多个B类型之间 ,长度优先(表达式的长度越长,优先级越高)

C. 类型:正则表达式匹配,“”区分大小写,“*”不区分大小写。*

   # ~* 类型:正则表达式匹配,不区分大小写。
   location ~* \.(gif|jpg|jpeg)$ {#这里表示匹配所有以 gif jpg jpeg结尾的请求。。
   		......
    }
   # 多个C类型之间,顺序优先
   # ~ 类型:正则表达式匹配,区分大小写。
   location ~ /static/Abc {#这里表示匹配所有以 /static/Abc开头的请求。
   		......
    }
    # 多个C类型之间,顺序优先,也就是location在前面的优先级高

D. 普通类型:字符串前缀匹配,没有“=,~,^,*”这些符号,优先级最低

   # 普通类型:字符串前缀匹配,优先级最低
   location /static/ {#这里表示匹配所有以 /static/开头的请求。
   		......
    }
    # 多个D类型之间,长度优先

image.png

还需牢记的一点是,如果是这样配置的

   location ~ /static/a {
   		root /home/web/yase;
    }
    # 如果访问路径是:/static/a.html,那么Nginx会去 /home/web/yase/static 文件夹下,找a.html

2. 特训一下

实际体验一下这4中类型,说出下面7个location,都属于什么类型

   location / {
   		【1】
    }
   location = /static/b {
   		【2】
    }
   location ~ /static/ {
   		【3】
    }
    location ^~ /images/ {
   		【4】
    }
    location /images/ {
   		【5】
    }
    location ~* \.(gif|jpg|jpeg)$ {
   		【6】
    }
    location ~ /static/a {
   		【7】
   }

答案:
56.png
问:路径是:/yase/a.html,会被哪个匹配到?
答:选【1】,因为其他的都比配不上

问:路径是:/images/yase.jpg,会被哪个匹配到?
答:选【4】。这个【1】【4】【5】【6】都可匹配,因为【4】是B类型,【6】是C类型,【1】【5】是D类型,B类型优先级最高

问:路径是/static/a.html,会被哪个匹配到?
答:选【3】

3. 生产建议

在生产环境中使用,一般不建议设置那么多的location,设置3种足以
第一个是首页

  # 第一个,必选规则,访问域名是直接返回首页
  location = / {
      # 转发到首页
      proxy_pass http://localhost/yase.html;
    }
  location = /yase.html {
      root /home/web/yase;
  }

第二个,处理其他静态资源

  # 第二个,必选规则,访问静态资源时,直接返回,这也是nginx的强项
  location ^~ /static/ {
      #站点根目录,静态资源都可以放到这里
      root   /home/web/yase;
    }
  

第三个,就是处理其他动态资源了

  # 第三个,处理动态资源请求
  location / {
  		# 直接转发到后端业务服务器
      proxy_pass https://www.baidu.com/;
    }
  # 这样配置如果访问路径是:/getById?id=1
  # 就会转发到 https://www.baidu.com/getById?id=1
  
posted @ 2023-02-23 16:42  空空大首领  阅读(38)  评论(0)    收藏  举报