Nginx入门
学习目标
- nginx基础使用
- nginx主要配置
- server
- location
- 利用nginx的代理转发访问后台java服务
- nginx限流功能
1. 介绍
Nginx跟Tomcat、Apache一样,也是web服务器软件,但是它更擅长处理像图片、css这样的静态资源

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

Nginx和Apache一些性能上的比较


Nginx的市场占有率

2. 应用场景

1. 静态资源服务器
Nginx在处理HTML、css、图片等这些静态资源请求的速度是非常快的,根据之前的图片,你也可以了解一二。
重要的是可以把你网站上的动态资源和静态资源分开,这就是动静分离
2. 正向代理
我们平常访问google是不通的,需要花钱买个VPN,通过这个VPN就可以在自己电脑上访问google、youtube这样的网站了。这个VPN就可以说是我们的正向代理服务器。
这时候访问者的身份对google来说是隐藏的

3. 反向代理
反向代理跟正向代理正好相反,正向代理隐藏的是请求者的身份,反向代理隐藏的是服务者的身份

根据上图,请求会先到达这个反向代理服务器,它会把请求在转发到真正服务器,拿到结果后在返回。
再举个通俗的例子,假如你需要钱,但是又不知道谁有钱,所以你找了一个网贷平台,提交资料后,平台把钱打给你,你并不知道也不需要关注,这钱是谁的,从哪里来。平台拿到你贷款的请求后,会在内部去找对应的金主拿钱,拿到钱后再给你。这些金主才是真正的服务者,但是对你而言是隐藏的。

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

上图表示 Nginx也可以直接连接数据库、redis
应用服务它本身的性能有很多问题,但是数据库服务要比应用服务好的多,因为它的业务场景比较简单,它的并发性能和TPS都要远高于应用服务,所以衍生出这一应用场景——由Nginx直接去访问数据库、redis或应用服务。
简单来说:能在Nginx里写业务代码
3. Windows安装启动
1. 下载
下载地址:http://nginx.org/en/download.html

- Mainline version: Nginx 目前主力在做的版本,可以说是开发版
- Stable version: 最新稳定版,生产环境上建议使用的版本
- Legacy versions: 遗留的老版本的稳定版
我们使用稳定的版本,nginx/Windows-1.18.0
2. 安装启动
我下载好后,是个zip压缩包,解压后

双击nginx.exe文件并没有用,需要在命令行里启动
打开命令行,并切换到ngixn解压目录,输入:nginx.exe 或者 start nginx
如果提示下面的错误,

说明80端口被占用了,Nginx默认监听的是80端口,但是可以修改,找到conf目录下的nginx.conf

修改红框处,改成8888,再次启动

打开浏览器,输入:localhost:8888,结果应该是这样子的。

使用 start nginx 这个命令可以后台启动,先执行:nginx -s stop ,把nginx关掉
再次执行 start nginx, 结果:

这样就可以继续输入其他命令了,同时还可以用 tasklist /fi "imagename eq nginx.exe" 来查看nginx是否启动

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







2. 安装
下载地址:http://nginx.org/en/download.html
http://nginx.org/download/nginx-1.18.0.tar.gz
下载Nginx的Linux版本

下载完成后传到centos虚拟机里的/usr/local/src目录

执行:tar -zxvf nginx-1.18.0.tar.gz,结果

进入nginx-1.18.0目录

在当前路径下执行这句命令
./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

安装完成后,可以用whereis nginx命令来查看Nginx安装的地址。

解释一下:
| 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就可以启动了

使用 ps -ef | grep nginx ,可以查看是否启动,启动成功后应该是这样子的

在浏览器中也可以访问

如果浏览器不显示:

使用这个命令 **firewall-cmd --state_, 查看一下Centos虚拟机的防火墙是不是正在运行
如果是运行状态

使用下面命令关掉防火墙就行了
# 关闭防火墙
[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

最后在浏览器输入:yase.cn

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

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


总结:通过一个服务器能达到多个网站的访问效果,这就是虚拟主机
注意:每个 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;
结果:

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


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

<CTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>亚瑟</title>
</head>
<body>
<h1>亚瑟一技能可以穿墙</h1>
</body>
</html>
注意:切记在保存html文件的时候一定要用utf-8编码
这时候访问:http://yase.cn/one.html,结果是正常的

修改yase.conf

注意:这时候留两个 location,分别指向不同的路径
再次访问:http://yase.cn/one.html

这是因为不同的 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类型之间,长度优先

还需牢记的一点是,如果是这样配置的
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】
}
答案:

问:路径是:/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

浙公网安备 33010602011771号