学习nginx之前首先我需要了解目前主流的服务器的优缺点以及他的应用场景
- Nginx优点:负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;
- Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。
- Tomcat:动态解析容器,处理动态请求,是编译JSP\Servlet的容器,Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。
Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache较适合。
真的日常工作中,一般的项目还是用nginx+tomcat来做会多一点。
Nginx的编译安装
1.官网
www.nginx.net
下载所需要的nginx软件包
2.安装编译工具
yum install -y gcc gcc-c++ autoconf automake
3.解压-编译-安装
1)解压
2)编译设置,在编译之前需要设置好,安装路径,可执行文件的路径,配置文件的路径,等等能想到的几乎都有,没有的话,自己开发也可以,因为nginx支持二次开发,模块拓展
互联网或者该命令可以查看你为什么需要该模块
./configure --help
./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginxpid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
Nginx的启动,停止,平滑重启
1.nginx的启动
/usr/sbin/nginx -c /etc/nginx/nginx.conf
-c是指定配置文件
2.nginx的停止
使用nginx命令
[root@192 nginx-1.22.1]# /usr/sbin/nginx -s stop
使用信号
kill -信号类型 `cat /var/run/nginx/nginx.pid`
一些Nginx支持的信号
1)查看进程号:其中master是主进程,或者直接查看上边配置的nginx.pid
2.) 从容停止
从容是指,比较安全的停止nginx,比如未处理完成的连接,处理完成之后停止
[root@192 nginx-1.22.1]# kill -QUIT ` cat /var/run/nginx/nginx.pid `
3)快速停止
[root@192 nginx-1.22.1]# kill -TERM ` cat /var/run/nginx/nginx.pid `
4)强制停止
kill -9 进程号
5)平滑重启
1.重启之前,检查配置文件是否错误
[root@192 nginx-1.22.1]# /usr/sbin/nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
2.信号执行重新装载配置文件
修改配置文件
[root@192 nginx]# echo this is a index2.html > /usr/html/index2.html
#我在此处运行的脚本的底层就是KILL -s HUP `cat PATH` 的指令
[root@192 nginx]# ./auto-nginx.sh rl
[root@192 nginx]# curl 127.0.0.1
自动启动停止脚本
#!/bin/bash
NGINX="/usr/sbin/nginx"
PID="/var/run/nginx/nginx.pid"
restart()
{
if [ -f $PID ]
then
echo "Nginx will be killed ! "
stop
sleep 1
fi
start
}
start()
{
if [ -f $PID ]
then
echo "Nginx is already runing ! "
else
$NGINX
echo "Nginx is runing ! "
fi
}
stop()
{
if [ -f $PID ]
then
kill -s QUIT ` cat $PID `
echo "Nginx is stopped ! "
else
echo "Nginx is already stop ! "
fi
}
reload()
{
if [ -f $PID ]
then
kill -s HUP `cat $PID`
fi
}
case $1 in
"sr") start
;;
"so") stop
;;
"rl") reload
;;
"rs") restart
;;
*) echo "please entry the current word "
;;
esac
平滑升级
这是说,当我使用Nginx某个模块的时候发现没有安装该模块,又不想停止该Nginx业务
这就起到作用了
1)备份之前的Nginx程序
[root@192 nginx]# cp /usr/sbin/nginx /usr/sbin/nginx.bak
2)重新编译Nginx,覆盖原安装目录,执行安装
[root@192 nginx-1.22.1]# pwd
/root/nginx/nginx-1.22.1
[root@192 nginx-1.22.1]# ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/test/error.log --pid-path=/var/run/nginx/nginxpid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
和上一次编译的区别是我修改了日志文件的位置,这无关紧要
3)执行平滑升级可执行程序命令
[root@192 nginx-1.22.1]# kill -USR2 `cat /var/run/nginx/nginx.pid`
[root@192 nginx-1.22.1]# cd /var/run/
console/ faillock/ lock/ mount/ nginx/ setrans/ tmpfiles.d/ user/
cryptsetup/ firewalld/ log/ netreport/ plymouth/ sudo/ tuned/ vmware/
dbus/ initramfs/ lvm/ NetworkManager/ sepermit/ systemd/ udev/
[root@192 nginx-1.22.1]# cd /var/run/nginx/
[root@192 nginx]# ls
nginx.pid nginx.pid.oldbin
可以看到旧版本的pid被命名为一个后缀为old的文件,并且此时会启动新的工作进程,他们共同处理事务
4)从容退出旧的进程
可以看到旧的work已经不再工作
5)决定使用新旧版本
完成平滑升级
6)检查是否更新成功
验证成功
问题:
启动显示: nginx: [emerg] open() "/var/run/nginx/nginxpid" failed (2: No such file or directory)
我手动创建了该目录,但是当我的虚拟机重启,该目录就消失了
解决方法: 在配置文件当中配置这样一项
pid /var/run/nginx/nginx.pid;
然后再创建目录
mkdir /var/run/nginx
chown nginx:nginx /var/run/nginx/
在编写shell脚本的时候,restart()函数 的时候,前提条件是我的Nginx已经被关闭
然后我执行了三次脚本的restart
1.Nginx被启动,没什么问题
2.Nginx被关闭,关闭提示语,到了应该开启的部分他却直接显示已经运行而不是刚打开
针对于本次问题:我认为是刚刚结束掉进程需要一段时间完成,再去开启下一个指令,因此我加入了sleep 1 完成debug