本文介绍Nginx的基本安装及使用
环境配置
我这里演示在 centos7.9
下, 通过源码编译的方式安装 nginx, 步骤如下
在正式开始安装之前, 我们要先配置好我们的linux环境, 先安装以下依赖
yum -y install zip unzip gcc gcc-c++ automake autoconf libtool make glibc gd-devel pcre-devel libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libevent libevent-devel |
源码包下载
接下来就开始我们的安装流程了, 首先在我们的centos下随便找个目录, 接着去nginx官网找到源码包, 点击前往官网 nginx: download
我们选中 stable
下, 中间那个, 这是长期支持版, 然后鼠标右键, 复制下载链接
复制好下载链接后, 回到我们的centos, 执行以下命令, 下载源码包到当前目录下
wget https://nginx.org/download/nginx-1.20.2.tar.gz |
当下载好后, 我们会看到当前目录下有一个压缩包, 我们执行以下命令进行解压
tar zxvf ./nginx-1.20.2.tar.gz |
解压好后, 我们cd进解压后的文件夹内
cd ./nginx-1.20.2 |
configure配置
随后, 我们对nginx源码编辑进行一下配置
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module |
--prefix=/opt/nginx
代表nginx要安装在哪个目录--with-http_stub_status_module
可以展示nginx的状态--with-http_ssl_module
可以让nginx支持ssl, 也就是支持https--with-http_image_filter_module
可以让nginx处理图片的裁剪及缩放等功能--with-http_v2_module
可以让nginx支持http2--with-http_gzip_static_module
可以让nginx支持Gzip压缩--with-http_sub_module
可以让nginx支持字符串替换
以上这几个是我们常用的模块, 你也可以根据自己的需求, 加装别的模块
编译
接下来, 执行源码编译操作,直接执行以下命令即可
make |
安装
源码编译好之后, 编译成品位于objs目录下, 里面有一个nginx可执行文件
到上面那一步后, 我们仅仅是完成了编译的步骤, 并没有开始安装, 如果大家想要安装nginx的话, 可以再执行 以下命令
make install |
如果你不想要安装, 你也可以复制objs/nginx去替换你以前旧的nginx
基本命令
nginx中, 常用的命令不多, 来来去去也就这几个
nginx -t
检查配置文件是否正确nginx -s reload
重启nginxnginx -s stop
强行停止nginxnginx -s quit
正常停止nginxnginx -s reopen
重新生成新的日志文件nginx
启动nginx
如果你想要把nginx配置成全局命令, 可以把nginx的可执行文件, 软连接到/usr/bin目录下
ln -s /opt/nginx/sbin/nginx /usr/bin/nginx |
配置软链接需要使用root权限, 并且源路径和目标路径都必须是绝对路径
如果我们修改了nginx的配置文件,需要重启nginx才会生效,建议采用 nginx -s reload
进行平滑重启
基本配置
打开我们nginx的安装目录, Nginx的基本配置如下(nginx.conf)
user root; # 采用root用户运行 |
conf配置
在上面的配置文件中,我们注意到最后一行
# 导入我们自己的conf配置 |
如果我们把所有web应用的配置都写到nginx.conf中的话, 这个文件就太大了, 也不好看, 因此, 我们可以把每一个应用的配置单独写到一个conf文件中, 然后再在nginx.conf中统一引入
那么上面那行的意思就是, 引入上一级app目录下, 所有以.conf为后缀的文件
既然是引入这个路径, 那么我们就必须先有这个目录, 行吧, 回到上一级目录, 创建app目录
mkdir /opt/nginx/app |
然后, 我们创建一个自己的web应用配置
touch /opt/nginx/app/my-app.conf |
配置参考
写入以下内容
# /opt/nginx/app/my-app.conf |
限流
所谓限流就是限制用户的请求数量, 这同时也是防范爬虫的一种手段之一, 当某个时间段内监测到同一个ip的大量请求时, 将禁止其继续请求
限流的指令为以下2个, 我们只需要将其写到http块下即可
# 定义限流策略, IP限流, 每个ip每秒4次请求 |
mylimit
: 仅仅只是我们随便写的一个策略名称, 大家可以随便起rate
:4r/s代表每秒处理4个请求burst
:50 代表50个请求缓冲区- 假如一瞬间来了10个请求,我们1s只能处理4个请求,还剩下6个没有得到处理,那么这6个请求,就会被塞进burst这个缓冲区排队等候服务
- 假如一瞬间来了100个请求,nginx是先处理前4个,剩余的96个会被放到burst,但burst只有50个位置,因此多出的46个请求 会根据nodelay的设置执行不同的处理
nodelay
:代表当请求数超出burst时,超出的请求如何处理,是放弃还是保留- 设置:nginx请求频率扩充为(rate + burst),请求数超过(burst + rate)的时候就会直接返回503
- 不设置:请求数超过(burst + rate)的时候,超出的请求进入排队等待状态,等待进入burst缓冲区
安全
服务器安全是重中之重,我们要防范各种web安全攻击,非法请求,网络爬虫等,除了前后端人员都做好响应处理之外
我们也可以在nginx中做一层处理,强化服务器的安全配置
为防范上述说的这些问题, 我们可以在server块增加如下配置
你也可以单独写到一个conf文件中, 然后在每一个server块中通过include引入进来
# 禁止浏览器资源类型猜测 |
关于http2.0, 这块启用的前提是, 你的nginx支持http2.0协议
目前大部分浏览器几乎都支持http2.0了, 而大多数爬虫工具还未支持http2.0
因此, 封杀非http2.0可以缓解大部分的爬虫流量, 但同时也会误杀友军
因为某些人的浏览器可能是上古遗留下来的, 不支持http2.0
当然,上面这些配置大家看着来设置就好了,不强求
网络安全上的配置还有很多,例如防火墙设置,文件传输限制,禁止国外IP等等,这些操作太多了,就不在此展开描述了,感兴趣的大家可以去百度。
日志备份
当我们采用nginx来代理我们的web应用时, 外界的每一个请求, 在经过nginx时, 都会被nginx给记录在日志中
nginx的日志分为2种
- access.log:访问日志
- error.log:错误日志
access.log代表的是正常的http访问日志
error.log代表nginx出现错误,崩溃等日志,它主要指nginx自身出现的问题
随着nginx长时间运行,以及用户访问量的不断加大,日志文件也会相应的越来越大,那么,由于日志文件变大了,自然而然地,写入日志的速度也就变慢了。
在这种情况下,我们就可以选择定时对日志文件做切割及备份操作
这里我们的流程是:
每天凌晨00:00的时候, 在指定路径下创建一个文件夹, 以日期时间来命名该文件夹, 随后把昨天的日志文件拷贝到该文件夹下, 最后, 生成新的日志文件
由于需要定时执行, 我们可以在nginx的日志目录下, 创建一个shell脚本文件, 命名为split_log.sh, 内容如下
! /bin/bash |
然后赋予该脚本文件执行权限
chmod +x ./split_log.sh |
那么, 我们这个脚本文件的作用就是:
- 得到当前的日期, 格式为
%Y-%m-%d-%H-%M-%S
- 在
/opt/nginx/logs/history/
下创建一个文件夹, 文件夹的名称就是上面得到的日期 - 通过
mv
指令移动access.log和error.log - 最后, 通过
kill -USR1
让nginx生成新的日志文件并使用
我们接下来做最后一个步骤, 我们要求的是定时执行, 因此我们需要在linux中配置一条定时任务
我们在命令行输入 crontab -e
编辑定时任务配置文件, 在这个文件内加入下面的命令
0 0 * * * /bin/bash /opt/nginx/split_log.sh |
0 0 * * *
代表每天的0点0分, 从左到右分别代表分、时、日、月、周,星号代表任意数字/bin/bash
代表你要执行谁/opt/nginx/split_log.sh
就是我们要执行的文件了
新人可能会疑惑,我不是要执行split_log.sh吗?为什么上面写了我要执行/bin/bash?
因为,split_log.sh是一个shell脚本文件,shell脚本都是由/bin/bash来帮我们执行的
效果图:
图像裁剪
我们在做web应用时,经常会由这么一个需求,前端访问同一张图片,有时需要得到不同的尺寸,例如缩略图和原图
这一个步骤虽然说可以交给我们的后端来完成,但如果nginx能做的话,也能为我们剩下不少力呢
在nginx中也是可以实现对图片的裁剪的,前提时你的nginx要有 image_filter_module
这个模块,参考最前面的configure配置教程
假设我要访问的路径是以下2个
缩略图:http://xxx.com/pictures/beautiful-girl.png!100x100
这2个链接,区别只在于缩略图只是在后面多了
!100x100
这么一个参数,我们可以理解为宽100x高100,通过感叹号来对路径和尺寸做分隔
那么我们在location中就可以这么来配置
# 静态资源转发 |
静态资源转发
通常我们会采用nginx来处理前端的静态资源,其基本原因在于nginx处理静态资源的效率非常高
前端同学也知道,nodejs同样可以转发静态资源,但是呢,效率是真的没有nginx高,完全输给nginx,因为二者的传输原理是不一样的
那么,在nginx中如何转发静态资源呢?可以采用 root
或者 alias
来转发,来看个例子
location /static/ { |
如果我访问的链接是 http://xxx.com/static/beautiful-girl.png
那么,会被/static/这个规则匹配到
然后真实的访问地址是:/opt/project/image/static/beautiful-girl.png
如果我访问的链接是http://xxx.com/picture/beautiful-girl.png
那么,会被/picture/这个规则匹配到
然后真实的访问地址是:/opt/project/image/beautiful-girl.png
看出来区别了吗?
- root: 真实路径 = root路径 + 匹配路径
- alias: 真实路径 = alias路径
如何取舍呢?我该用哪个呢?看你自己咯!
路径重写
在前后端开发中,我们在写接口时,经常会有这种情况
开发模式下,所有接口以 /api
开头
生产模式下,删掉 /api
写过前端proxy的同学应该都了解过一个叫rewrite的东西,就算没用过,也肯定见过,它的作用就是重写我们的请求路径
简单来说,就是修改一下请求的路径,然后,就没了
那么,这个步骤在nginx中同样可以做到,怎么做呢?在location内写
location /api/ { |
当我们配置以上规则后,那么,产生的效果就如下
http://xxx.com/api/users => http://xxx.com/users |
那假如我要重写的是路径中间的部分,又该怎么办呢?同理
location /api/aaa/ { |
当我们配置以上规则后,那么,产生的效果就如下
http://xxx.com/api/aaa/users => http://xxx.com/bbb/users |
rewrite语法规则
共有3个参数,每个参数用空格隔开
- 第一个参数:正则表达式,用来做匹配的
- 第二个参数:新的内容
- 第三个参数:可选,值有break, last, redirect, permanent,具体区别自己去百度,这里不详写
如果第二个参数是一个链接,则第三个参数就相当于redirect重定向,浏览器访问到时,会重定向(跳转)到你指定的链接
以上就是rewrite的内容了,它除了可以重写反向代理的路径,也可以重写静态资源的访问路径,这些由大家自己去尝试了
变更用户
正常情况下,我们不建议采用root用户来运行nginx,这里所说的用户,是指你在nginx.conf中的user字段
我们应当使用其他用户,或创建其他用户来进行执行
创建用户
执行以下命令,创建一个nginx用户
useradd nginx |
设置密码
执行以下命令,设置nginx用户的密码,然后根据提示输入2次密码即可
passwd nginx |
修改conf
创建好用户并设置密码后,我们就要去修改nginx.conf中的user字段
# nginx.conf |
然后执行 nginx -s reload
重新启动就可以了
目录权限
新创建的nginx这个用户没有啥权限,nginx要访问的静态资源文件等都需要给它赋予相应的权限,否则nginx没法读取
假设你有一个静态博客站点,所在的文件夹是 /opt/blog
那么你就要把 /opt/blog
文件夹(包括子文件夹和文件)的权限都赋予给nginx用户,否则可能会没法访问这里面的东西
执行以下命令,将 /opt/blog
文件夹的所属用户和所属组都改为nginx
chown -R nginx:nginx /opt/blog |
执行以下命令,修改blog文件夹所属用户和所属组为 766 权限
chmod -R 766 /opt/blog |
766:三个数字表示三种权限
第一个数字代表所属用户权限
第二个数字代表所属组权限
第三个数字代表其他用户权限
只读:4
只写:2
执行:1
所属用户权限 :7 = 4+2+1
所属组权限:6 = 4+2
其他用户权限:6 = 4+2
上面的目录权限配置很重要,要是没有配置好,会出现403无法访问的情况
sudo权限
配置好目录权限后,我们接下来要为nginx这个用户配置sudo权限
因为,我们nginx代理了我们的80和443端口,而nginx有一个限制,假如代理的端口小于1024,就必须以超级管理员的身份启动
而我们为了安全起见,肯定不会使用root用户来执行的,所以我们可以给nginx用户配置sudo权限,让它可以采用超级管理员身份运行某些命令
用root用户登录,执行以下命令,编辑权限
visudo |
然后找到下面这个位置,添加我们的nginx用户
## Allow root to run any commands anywhere |
最后我们 :wq
保存并退出
重点:最后的最后,我们再用root用户执行以下命令,重置nginx用户环境变量及工作目录等数据,否则nginx用户几乎啥命令也用不了
su -l nginx |
有些同学在创建好用户后会发现,几乎啥命令也用不了,连最基础的cd, ll 等命令都没法用,就是因为你没有执行这条命令,要登录root,然后执行
到这里,我们的用户创建到权限配置就已经完成了
启动nginx
执行以下命令,切换到nginx用户空间
su nginx |
执行以下命令,输入nginx用户的密码,然后回车,启动nginx
sudo nginx |
结语
到此,我们的nginx配置流程大致都讲完了,这些配置不算很多,花点时间是可以学的来的,其中比较复杂的估计就是切换nginx的启动用户了
在这一块上不熟悉的同学还需得多练习练习,也不是说写多了就会了,其实你看多了你会的
本片文章并没有把nginx的内容完全讲完,包括负载均衡等,这些在网上大把大把的,大家花点时间去看看就好
这篇文章适合有一丢丢nginx和linux经验的人看,主讲一些外界教程较少的知识吧