Nginx的3个主要的应用场景
1.静态资源服务
2.反向代理服务
3.API服务
优点:
高并发下达到高性能
可扩展性(有很多第三方插件),高可靠性(很难宕机)
热部署
BSD许可证
Nginx的组成:
二进制可执行文件
nginx.conf配置文件
access.log 访问日志,记录每一条http请求
error.log错误日志
Nginx的编译安装:
进入http://nginx.org/en/download.html下载nginx包
tar -xzf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx #configure完成后会生成一些中间文件在objs目录;里面有一个ngx_modules.c文件,里面列举着待会编译时会安装哪些模块。
make
make install
cd /usr/local/nginx && ll
#conf,html,logs,sbin 四个目录,放啥东西的一目了然
====================================
Nginx的配置语法
1.配置文件由指令和指令块构成
指令以;结尾,指令与参数将以空格分开
指令块以{}大括号将多条指令组织在一起。有些指令块有名字有些没有。
2.include语句可以引入多个配置文件
3.使用$表示使用变量
4.部分指令的参数支持正则
Nginx中的时间单位:
ms 毫秒
s 秒
m 分钟
h 小时
d 天
w 周
M 月
y 年
Nginx中空间单位
空 字节
k/K m/M g/G
Nginx 基本命令
启动:nginx
重新加载配置文件(相当于重启):nginx -s reload
帮助:-h
使用指定的配置文件启动:-c
指定新的配置: -g
指定运行目录:-p
发送信号:-s
如 nginx -s reload 重启
nginx -s stop 停止
nginx -s quit 优雅的停止
nginx -s reopen 重新开始记录日志文件
测试配置文件是否有语法错误: -t
打印 nginx 的版本信息、编译等: -v
注意:nginx -s reload 可以在不停止对客户服务的情况下重新加载配置文件;所以虽然运行这条命令没有停止服务再开启服务,但是重新加载了配置文件,其实也算是一种重启。
接下来做3个小演示:
首先开启nginx服务
nginx
此时在浏览器输入ip即可访问到nginx的欢迎首页
1.重载配置文件
# 将监听端口修改为8080并重启
vi /usr/local/nginx/conf/nginx.conf
listen 8080;
nginx -s reload
ps -aux|grep :8080
2.热部署
所谓的热部署就是在不停止nginx服务的条件下更行nginx的版本。
更新nginx只需更新它/usr/local/nginx/sbin目录下的nginx命令就可。
# 先备份nginx命令
cd /usr/local/nginx/sbin && cp nginx nginx_bak
# 解压新版本或者旧版本的nginx
tar -xzf nginx-1.14.2.tar.gz
./configure --prefix=/usr/local/nginx #这里--prefix要和之前的nginx一样
make # 编译
编译后,在中间目录 nginx-1.14.2/objs中会出现nginx二进制文件,这就是我们要替换的nginx命令
cp /root/nginx-1.14.2/objs/nginx /usr/local/nginx/sbin/nginx -f #将objs中的nginx覆盖旧的nginx,这里要加一个-f强制覆盖,因为旧的nginx还在运行,不强制覆盖是不会让你覆盖的。
千万不要 make install
由于没有执行 make install 所以这里只是替换了命令文件为新版本的nginx的命令文件,像配置文件什么的都还是原来的配置。
cd /usr/local/nginx/sbin && ll
-rwxr-xr-x 1 root root 3746472 Feb 1 11:00 nginx
-rwxr-xr-x 1 root root 3825224 Feb 1 10:42 nginx_bak
现在可以看出两个nginx是不一样大的,是两个版本的nginx
接下来我们要启动新版本的nginx,将请求平滑过渡到新的nginx进程。
# 查看nginx进程
ps -aux | grep nginx
root 23867 0.0 0.0 20596 1396 ? Ss Jan31 0:00 nginx: master process nginx
nobody 25011 0.0 0.0 23108 1756 ? S Jan31 0:00 nginx: worker process
root 24640 0.0 0.0 112708 980 pts/0 S+ 10:36 0:00 grep --color=auto nginx
这里nginx会有两个进程,master和worker
# 发送一个信号给nginx master进程,告诉他我们要开始热部署
kill -USR2 23867
这样的话nginx会新起一个master和worker进程(此时就有两个nginx的master和worker进程),这个master进程相当于是重新启动了一个nginx服务,此时旧的nginx的master进程和worker进程依旧存在,但是已经不再监听80或者8080端口。
# 发送一个信号让旧的nginx优雅的退出
kill -WINCH 23867
ps -aux | grep nginx
此时可以看到旧的nginx master进程还在,旧的nginx worker进程已消失。此时所有请求都已经过渡到了新的nginx进程中。旧的nginx master进程还在是为了当新版本的nginx有问题时可以回退到旧版本nginx
本人在做到 kill -USR2 的时候发现并没有新起一个master和worker进程,可能是因为我的电脑只有单核。
cat /proc/cpuinfo| grep "cpu cores"| uniq #查看核数
所以我直接使用
nginx -s quit && nginx
进行重启
3.切割日志
就是将每天的日志先备份一份到别的地方,然后使用nginx -s reopen 命令清空旧的日志,重新记载,这样防止日志不停地积累到一个文件导致日志文件过大。
cd /usr/local/nginx/logs # nginx日志存放目录
mkdir logs_bak
cp ./access.log logs_bak
nginx -s reopen #清空旧日志并重新记录
可以将这个过程写到定时任务每天或者每周执行一次。