nginx
1.nginx基础知识
1.1 什么是Nginx
开源、高性能、可靠的Http Web服务器、代理服务器。
1.2 为什么选择Nginx
1.高性能、高并发(在访问的高峰期时,nginx能比其他web服务器有更快的响应)
2.高扩展性 (可以将功能模块化。 支持官方模块、第三方模块)
3.高可靠性(nginx可持续不间断运行) 4个9 5个9
4.热部署(可在不停止服务的情况下升级Nginx)
5.公司都选择使用Nginx
1.nginx成熟
2.nginx具备非常多的功能 ( 负载均衡、缓存、静态资源加速、web服务、.........waf )
3.nginx上手难度较低、配置文件清晰、
4.统一技术债 ( nginx apache、)
1.3 Nginx使用场景
1.nginx反向代理
2.nginx负载均衡
3.nginx HTTPS、Rewrite、
4.nginx 限速、限流、等等
1.4 Nginx基本安装、配置、启动
1.配置nginx的官方源,打开nginx.org
点击download
2.点击stable and mainline
3.选择对应的系统版本
4.设置 yum 仓库,创建文件 /etc/yum.repos.d/nginx.repo
,写入以下内容(我这里使用稳定版本的)
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
5.安装yum install nginx -y
1.5 nginx的配置文件
1.nginx 的相关配置文件
[root@tpl 一 8月 01 18:38 ~]# rpm -ql nginx
/etc/logrotate.d/nginx #日志轮转配置文件 ( 按天切割日志 )
/etc/nginx
/etc/nginx/conf.d #编写网站的配置文件
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types #返回的文件类型 ( 以下载形式回传给浏览器 )
/etc/nginx/modules
/etc/nginx/nginx.conf #重要( 主配置文件 )
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params #结合py
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx #二进制程序
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.22.0
/usr/share/doc/nginx-1.22.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx #日记路径
2.nginx主配置文件
[root@tpl 一 8月 01 19:11 ~]# cat /etc/nginx/nginx.conf
user nginx; #运行nginx进程的身份
worker_processes auto; #nginx worker进程数 ( CPU核心保持一致 )
error_log /var/log/nginx/error.log notice; #错误日志存放的路径 ( 什么级别的错误才记录 )
pid /var/run/nginx.pid; #nginx进程运行起来会将进程的ID存储在指定的一个文件中
events {
worker_connections 1024; #worker最大支持的连接数 worker_connections * worker_processes
}
--------------------------------------------------------------------------------------
#网络层
http {
include /etc/nginx/mime.types;
default_type application/octet-stream; #如果返回的文件 mime.types 不识别此类型,则默认以下载方式返回给用户
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
------------------------------------------
#'$remote_addr(来源IP) -
#$remote_user(使用什么用户登陆的)
# [$time_local](时间)
#"$request"(包含请求的方法,内容,版本) '
#'$status(状态码)
#$body_bytes_sent(发送的大小)
#"$http_referer"(从哪个页面跳转过来的) '
#'"$http_user_agent"(客户端设备详情信息)
#"$http_x_forwarded_for"'; (浏览当前页面的用户计算机的真实IP地址)
-------------------------------------------
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/下的所有以.conf结尾的文件
}
3.nginx配置文件编写
例:
1.在特定路径下编写配置文件
vim /etc/nginx/conf.d/test.conf
server{
listen 80; #网站监听的端口
server_name www.test.com; #定义网站访问的域名
location / { (location是用于控制用户请求的URI的路径的)
root /test; #定义站点代码存放的路径(根路径)
index index.html; #定义站点默认返回的页面
}
}
2.测试时记得修改本地的hosts文件,做个劫持,将IP地址与域名绑定
192.168.xx.xx www.test.com
3.根据配置文件,在本地准备一个目录,还有一个配置文件
4.重载nginx
systemctl reload nginx
5.查看测试效果:
1.6 如何查找URL中对应服务器的真实文件存放路径
URL:http://www.test.com/download/test1.txt
URI:download/test1.txt
真实的文件存放路径=nginx配置文件中定义的服务根目录+URI
所以这里的文件真实路径是:/test/download/test1.txt
1.7nginx虚拟主机
在一台服务器上运行多个网站。 通过配置虚拟主机的方法来实现。
1.基于主机多IP的方式 pass ( 服务器有多个IP,10网段配置一个网站,172网段配置一个网站 )
2.基于端口的方式 公司内部
3.基于域名的方式 必用
基于端口的方式:
1.编写配置文件
vim /etc/nginx/conf.d/port.conf
server{
listen 81;
location / {
root /port1;
index index.html;
}
}
server{
listen 82;
location /{
root /port2;
index index.html;
}
}
2.根据配置文件初始化本地目录文件
mkdir /port1
echo "port 81" >/port1/index.html
mkdir /port2
echo "port 82" >/port2/index.html
3.检查语法,重载nginx
nginx -t
systemctl reload nginx
4.查看测试结果
输入81端口:
输入82端口:
基于域名的方式:
1.编写配置文件
vim /etc/nginx/conf.d/test.conf
server{
listen 80;
server_name www.test.com;
location / {
root /test;
index index.html;
}
}
vim /etc/nginx/conf.d/test1.conf
server{
listen 80;
server_name www.test1.com;
loction / {
root /test1;
index index.html;
}
}
2.根据配置文件初始化本地目录文件
mkdir /test
echo "test" >/test/index.html
mkdir /test1
echo "test1" >/test1/index.html
3.做个劫持,将IP地址与域名绑定
192.168.xx.xx www.test.com
192.168.xx.xx www.test1.com
4.检查语法,重载nginx
nginx -t
systemctl reload nginx
5.查看测试结果
输入域名www.test.com
输入域名www.test1.com
1.8结合http协议,nginx整体访问流程
server{
listen 80; #第一步
server_name www.test.com; #第二步
location / { #第三步
root /test; #第四步
index index.html; #第五步 #第六步,返回/test路径下的文件index.html给浏览器
}
}
1.用户通过浏览器访问www.test.com
2.浏览器向DNS服务器请求解析域名www.test.com对应的IP地址
3.DNS服务器将解析出的IP地址返回给浏览器
4.浏览器通过TCP协议与IP地址对应的服务器80端口建立TCP连接
5.在TCP连接的基础上,浏览器发起HTTP请求,请求中会携带Headers
1.请求的域名:www.test.com
2.请求的方法:GET
3.请求的路径:/
4.请求的文档:index.html
6.服务器做出响应,将/index.html文件返回给浏览器
7.释放TCP连接
8.浏览器渲染显示index.html 页面内容
1.9编译安装nginx
nginx编译安装:
1.已经安装好了Nginx、需要你重新安装一次Nginx( 按照之前已经安装过的方式在来一次。)
nginx -V 获取以前的编译参数
找一台服务器重新安装,然后进行编译。
2.想使用源码安装,不用yum安装。
编译安装
1.找到一台已经安装过的Nginx,nginx -V,获取他的编译参数。
nginx -V
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
2.在新的机器,下载nginx软件,使用此前的编译参数进行编译即可。
wget http://nginx.org/download/nginx-1.23.1.tar.gz
3.解压
tar xf nginx-1.23.1.tar.gz
4.进入nginx目录
cd /nginx-1.23.1
ls
5.生成Makefile
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
6.make生成可执行的二进制文件,make install 将生成的二进制文件放到指定的位置上
make && make install
7.启动nginx
/usr/sbin/nginx -t
/usr/sbin/nginx
8.查看结果
不想用了,怎么移除nginx
1.找到根下所有名字包含nginx的文件
find / -name nginx
挨个删除即可 rm -rf
2.添加过Nginx开机自启动的,再执行以下操作
chkconfig nginx off
rm -rf /etc/init.d/nginx
如果是yum安装的
则:
yum remove nginx -y
rm -rf /etc/nginx
rm -rf /var/log/nginx/
1.10.nginx平滑升级
什么是平滑升级?
常规的升级操作是,停服务—>升级服务—>启动服务,是有感知的
平滑升级是,在进行服务升级的过程中,对于用户的访问是无感知的,(不会造成服务中断)。
低版本要向高版本升级时候,
下载完新版本的nginx后,
先要备份nginx的二进制文件,
再编译一个新的二进制文件出来,
然后通过命令向旧的master发送一个USR2的信号,
此时就会出现一种情况,旧的master与新的master共存的情况,
新老master同时处理用户的请求,新来的请求会由新的master处理,旧的master在处理之前没有处理完的请求,
当旧的worker进程完成以后,向旧的master发送WINCH信号关闭worker,
如果某个worker还有没处理完的任务,worker就不会关闭,直到任务结束后关闭,
此时就剩旧版本的master与新版本的master以及worker存在,
然后就可以向旧的master发送一个QUIT信号,退出旧的master,然后就完成了平滑升级。
平滑升级实现思路
1.下载新版本的Nginx
2.了解旧版本Nginx的编译参数
3.备份旧版本的Nginx、然后替换为新版本的Nginx
4.向旧版本的Nginx的Master进程发送USR2信号
4.1 旧版本的Nginx进程的pid文件会自动添加一个后缀.oldbin
4.2 master进程会用新的Nginx二进制文件启动新的Master进程和Worker进程。
5.向旧的Nginx Master进程发送WINCH信号,旧的worker子进程就退出了。
6.向旧的Nginx Master进程发送QUIT信号,旧的Master进程就退出了,此时平滑升级就结束了。
相关信号:
QUIT:优雅关闭
HUP:优雅重启 例如:reload指令
USR1:重新打开日志文件 ,相当于nginx -s reopen
USR2:平滑升级可执行的二进制文件
WINCH:平滑关闭Worker进程
实现平滑升级
大概步骤:
1.本地装有旧版本的nginx,nginx1.22.0版本
2.提供一个可下载的文件,用来验证我们的平滑升级过程中下载并没有中断
准备服务
server {
listen 80;
server_name down.test.com;
root /html;
limit_rate 200k; #限速200k
location / {
index index.html;
}
}
准备下载的文件
dd if=/dev/zero of=/html/bigdata bs=1M count=150
域名解析
然后进行访问,让其开始下载文件
3.下载新版本的nginx并解压,对其进行编译,然后生成二进制文件
tar xf nginx-1.23.1.tar.gz
cd nginx-1.23.1
3.1生成编译清单文件
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
3.2根据清单文件,生成可执行的二进制文件
make
3.3这里切记不要执行make install
,只需要二进制文件,不需要安装
4.备份旧版的nginx二进制文件,将新版本的二进制文件,拷贝到指定位置
4.1.备份
mv /usr/sbin/nginx /usr/sbin/nginx-1.22.0
4. 2.拷贝
cp objs/nginx /usr/sbin/nginx
5.检查进程情况,然后发送信号
发送USR2信号
然后会发现新老master共存的状况
6.关闭旧Master的Worker进程(如果worker进程正在处理任务,那么他不会退出,只有任务结束才会退出)
kill -WINCH 2355
因为我们还有下载进程没有结束,所以会显示worker process is shutting down
当后台下载的进程结束后,他就会退出
7.退出旧的master
kill -QUIT 2355
现在只剩新的master与他的worker
8.此时就平滑升级到了新的版本
在升级的期间下载始终是没有中断的,并不受升级的影响
1.11.nginx编译安装后,版本回退
当升级新版本后,发现不兼容新版本的nginx,可以选择将nginx版本回退到之前的版本。
版本回退
1.备份新版本的nginx二进制文件
mv /usr/sbin/nginx /usr/sbin/nginx-1.23.1
2.恢复旧版本的nginx二进制文件
mv /usr/sbin/nginx-1.22.0 /usr/sbin/nginx
3.查看nginx进程,然后发送USR2信号,然后会发现新老master共存的状况
ps -ef |grep nginx
kill -USR2 3561
4.关闭旧Master的Worker进程(如果worker进程正在处理任务,那么他不会退出,只有任务结束才会退出)
kill -WINCH 2355
5.退出旧的master
kill -QUIT 2355
6.当后台的下载结束后,旧的worker,master就会全部退出,最终只剩新的master与worker
7.nginx版本也顺利的回退到之前的旧版本