Nginx 学习
发布于: 2020 年 04 月 28 日
1. Nginx简介
Nginx [engine x]是HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器,最初由Igor Sysoev编写。很长一段时间以来,它已经在许多重负载的俄罗斯站点上运行,包括 Yandex, Mail.Ru, VK和 Rambler。根据Netcraft的数据,Nginx 在2020年3月服务或代理了 25.65%最繁忙的站点。以下是一些成功案例: Dropbox, Netflix, Wordpress.com, FastMail.FM。
Nginx 适用于各类网站,处理能力和可扩展性都优于apache,目前为止,主流网站几乎都采用的Nginx作为核心的服务.
2. Web软件排名[截至2020年4月]
3. Nginx优势:
配置简单
使用灵活
扩展性强
负载均衡
缓存服务
高并发[异步i/o]
模块化
4.Nginx目录介绍
未安装的Nginx目录介绍:wget http://nginx.org/download/Nginx-1.16.1.tar.gztar xf nginx-1.16.1.tar.gz cd nginx-1.16.1[root@k8s-node2 Nginx-1.16.1]# lltotal 752drwxr-xr-x 6 1001 1001 326 Apr 11 23:11 auto #自动编译脚本目录 -rw-r--r-- 1 1001 1001 296463 Aug 13 2019 CHANGES #变更说明-rw-r--r-- 1 1001 1001 452171 Aug 13 2019 CHANGES.ru #俄罗斯语变更说明drwxr-xr-x 2 1001 1001 168 Apr 11 23:11 conf #配置文件目录-rwxr-xr-x 1 1001 1001 2502 Aug 13 2019 configure #编译二进制文件drwxr-xr-x 4 1001 1001 72 Apr 11 23:11 contrib #语法显示配置 cp -r contrib/vim/* ~/.vim/drwxr-xr-x 2 1001 1001 40 Apr 11 23:11 html #默认网页目录-rw-r--r-- 1 1001 1001 1397 Aug 13 2019 LICENSE #许可文件-rw-r--r-- 1 root root 404 Apr 11 23:19 Makefile #make文件drwxr-xr-x 2 1001 1001 21 Apr 11 23:11 man #Nginx帮助文件drwxr-xr-x 3 root root 174 Apr 11 23:19 objs #二进制文件-rw-r--r-- 1 1001 1001 49 Aug 13 2019 README #解读文件drwxr-xr-x 9 1001 1001 91 Apr 11 23:11 src #源代码目录
5. Nginx编译模块介绍
在Nginx的模块中 带有 --with-xxx 这种是默认没有编译进Nginx中,通常需要手动添加后进行编译安装到Nginx中在Nginx的模块中 带有 --without-xxx 这种是默认编译到了Nginx中,需要使用该参数来取消或移出Nginx中在Nginx的模块中 带有 --with-xxx= 这种是需要你指定目录来进行编译安装到Nginx中Nginx的 make 预编译: 在Nginx中使用 make 进行了预编译后,所有的即将编译加入到Nginx中的功能模块都会在 ngxmodules.c 文件中. 查看 ngxmodules.c 可获取即将编译的Nginx有哪些功能:cat objs/ngx_modules.c
6. Nginx的安装
Nginx提供了多种方式,常用的有2种
6.1.yum安装:
yum install -y Nginx
6.2.编译安装:
yum install -y openssl openssl-develwget http://Nginx.org/download/nginx-1.16.1.tar.gztar xf nginx-1.16.1.tar.gz cd nginx-1.16.1./configure --prefix=/usr/local/nginx-1.16.1 --with-stream --with-httpstubstatusmodule --with-httpssl_modulemakemake install
6.3. 默认配置文件内容
[root@k8s-node2 Nginx-1.16.1]# egrep -v "#|^$" /usr/local/Nginx-1.16.1/conf/Nginx.confworkerprocesses 1;events { workerconnections 1024;}http { include mime.types; defaulttype application/octet-stream; sendfile on; keepalivetimeout 65; server { listen 80; servername localhost; location / { root html; index index.html index.htm; } errorpage 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
7. Nginx编译安装后目录:
编译完成后,Nginx安装的目标目录会生成大量文件
[root@k8s-node2 Nginx-1.16.1]# ll /usr/local/Nginx-1.16.1/total 0drwx------ 2 nobody root 6 Apr 11 23:21 clientbodytemp #临时文件目录drwxr-xr-x 2 root root 333 Apr 11 23:20 conf #Nginx配置文件目录drwx------ 2 nobody root 6 Apr 11 23:21 fastcgitemp #临时文件目录drwxr-xr-x 2 root root 40 Apr 11 23:20 html #Nginx网页目录drwxr-xr-x 2 root root 58 Apr 11 23:21 logs #Nginx日志文件drwx------ 2 nobody root 6 Apr 11 23:21 proxytemp #临时文件目录drwxr-xr-x 2 root root 36 Apr 12 00:16 sbin #Nginx二进制文件目录drwx------ 2 nobody root 6 Apr 11 23:21 scgitemp #临时文件目录drwx------ 2 nobody root 6 Apr 11 23:21 uwsgitemp #临时文件目录
conf 配置文件目录介绍
[root@k8s-node2 conf]# lltotal 68-rw-r--r-- 1 root root 1077 Apr 11 23:20 fastcgi.conf #fastcgi配置文件-rw-r--r-- 1 root root 1077 Apr 12 00:16 fastcgi.conf.default #fastcgi默认配置文件-rw-r--r-- 1 root root 1007 Apr 11 23:20 fastcgiparams #fastcgiparams配置文件-rw-r--r-- 1 root root 1007 Apr 12 00:16 fastcgiparams.default #fastcgiparams默认配置文件-rw-r--r-- 1 root root 2837 Apr 12 00:16 koi-utf #转码文件-rw-r--r-- 1 root root 2223 Apr 12 00:16 koi-win #转码文件-rw-r--r-- 1 root root 5231 Apr 11 23:20 mime.types #mime类型文件-rw-r--r-- 1 root root 5231 Apr 12 00:16 mime.types.default #mime模板类型文件-rw-r--r-- 1 root root 2656 Apr 11 23:20 Nginx.conf #Nginx配置文件-rw-r--r-- 1 root root 2656 Apr 12 00:16 Nginx.conf.default #Nginx模板配置文件-rw-r--r-- 1 root root 636 Apr 11 23:20 scgiparams #cgi接口-rw-r--r-- 1 root root 636 Apr 12 00:16 scgiparams.default #cgi接口-rw-r--r-- 1 root root 664 Apr 11 23:20 uwsgiparams #fastcgi文件-rw-r--r-- 1 root root 664 Apr 12 00:16 uwsgiparams.default #fastcgi模板文件-rw-r--r-- 1 root root 3610 Apr 12 00:16 win-utf #编码字符支持文件
8. Nginx配置语法:
1. Nginx配置文件是由指令和指令块构成的2. 每条指令都是以 ; 分号结尾,指令和参数中间使用空格来分隔开3. 指令块使用 {} 大括号将多个小取快组织到一起4. include语句是允许将组合多个配置文件,以提升可维护性5. 使用 # 符号来添加注释6. 使用 $ 符号来添加变量7. 部分指令支持正则表达式
9.Nginx指令:
nginx可以通过 nginx [选项] [参数] 来进行操作nginx -s 发送信号 -s reload 重载nginx -s stop 停止nginx -s quit 优雅停止nginx -s reopen 重新开始记录日志 nginx -h 获取帮助 nginx -? 也是同等效果nginx -c 指定配置文件nginx -t 检查配置nginx -T 检查语法并打印出配置文件内容信息nginx -p 指定运行目录[没用过]nginx -v 打印版本信息nginx -V 打印编译信息nginx 可以操作的进程有master进程和work进程master进程可以操作的信号:kill -HUP [进程id] 平滑读取配置文件kill -USR1 [进程id] 重新读取日志,不停止服务[在做日志切割的时候常用]kill -USR2 [进程id] 平滑重启nginxkill -WINCH [进程id] 等待进程结束后关闭nginx[常用于nginx版本升级] kill -QUIT [进程id] 优雅退出,执行完当前的请求后退出
10.Nginx版本升级
1. 下载新版本nginx2. 获取老版本nginx编译参数[nginx -V]3. 拿到编译参数编译新版本nginx4. 编译完成后,将老版本nginx二进制文件进行备份.5. 新版本nginx拷贝并覆盖原有nginx二进制文件 [\cp -ra objs/nginx /nginx/sbin/nginx]6. 给nginx发送指令给nginx的pid号,让新版本与老版本同时运行 [kill -USR2 cat nginx-pid]7. 新版本会启动一个新的nginx work进程,通过ps -ef|grep nginx 可以看到nginx新老进程都在运行了,这时老版本nginx就不会再处理新的请求了,但是老的master进程依旧存在,现在所有新的请求将会平滑过渡到新版本nginx中. 8.1 没有问题的话就可以优雅关闭 nginx work老进程,让它停止 [kill -WINCH cat nginx-pid] 记住此时老的nginx master进程它依然在运行中,它用于唤醒老进程. 8.2 如果有问题的话就重新拉起老版本nginx master进程和work进程. 重新拉起老版本,关闭新版本: 直接nginx -s reload 即可重新拉起老版本
11.NGINX日志切割
nginx重新重载会生成新的日志记录文件.通过这个特点我们可以写shell脚本来生成自定义日志文件.
保存为 cutlog.sh#---------------------------------------------------------------------------------------#!/bin/bash#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件#Nginx日志文件所在目录LOGPATH=/application/nginx/logs#获取昨天的日期YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)#获取pid文件路径PID=/var/run/nginx/nginx.pid#分割日志mv ${LOGPATH}access.log ${LOGPATH}access-${YESTERDAY}.logmv ${LOGPATH}error.log ${LOGPATH}error-${YESTERDAY}.log#向nginx发送reopen信号,只重新记录日志文件[建议用reopen而不是reload.]nginx -s reopen#---------------------------------------------------------------------------------------#脚本配置完毕,每天执行即可crontab -e00 00 /bin/sh cutlog.sh或echo "00 00 /bin/sh cutlog.sh" >>/var/spool/cron/root
陶辉写法: vi curlog.sh1. 脚本:#!/bin/bashLOGPATH=/application/nginx/logs/historyCUTLOG=/application/nginx/logstime=$(date -d "yesterday" +%Y-%m-%d)cp -a ${CUTLOG}/accesslog ${LOGPATH}/access${time}.logcp -a ${CUTLOG}/errorlog ${LOGPATH}/error${time}.logkill -USR1 $(cat /application/nginx/logs/nginx.pid)2.权限chmod +x /bin/sh cutlog.sh3.计划任务crontab -e00 00 * /bin/sh cut_log.sh
12. nginx 优化
12.1 gzip压缩
配置在 http server location 区块gzip on;gzipminlength 500;gzipbuffers 4 256k;gziphttpversion 1.1;gzipcomplevel 5;gziptypes image/png image/jpeg image/jpg image/gif text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss application/x-httpd-php;gzipvary on;gzipproxied expired no-cache no-store private auth;gzip_disable "MSIE [1-6]\.";
13. 静态资源目录配置
在 server location区块中添加以下参数,可以让用户以网页目录的形式访问:location / { alias mulu/; autoindex on;}此时通过网页访问这个路径,出现的页面将是以目录形式展现.
14. 网速限制
set $limit_rate 1k;用于对用户访问继续进行限速,这是个内置变量.可用于 server location 区块
15.日志定义
1. 定义日志格式[]http区块定义: logformat leilei '$remoteaddr - $remoteuser [$timelocal]' '"$request" $status $bodybytessent' '"$httpreferer" - "$httpxforwardedfor" - "$httpuseragent"'; 2. 应用日志格式access_log logs/access.log leilei;#注意:日志格式的定义在http区块中,这个日志格式可以定义多个,可以给多个网站记录详细日志.
16.反向代理服务
16.1 反向代理的工作流程
环境规划:10.0.0.64 nginx110.0.0.65 nginx210.0.0.66 upstream
10.0.0.64: yum install -y nginx echo "$(hostname -i)" >/usr/share/nginx/html/index.html 添加语法样式[nginx源码目录才有]: cp -r contrib/vim/ ~/.vim/10.0.0.65: yum install -y nginx echo "$(hostname -i)" >/usr/share/nginx/html/index.html 添加语法样式[nginx源码目录才有]: cp -r contrib/vim/ ~/.vim/10.0.0.66: mkdir /server #添加语法样式: wget http://nginx.org/download/Nginx-1.16.1.tar.gz tar xf nginx-1.16.1.tar.gz cd nginx-1.16.1 cp -r contrib/vim/* ~/.vim/ ##nginx配置 - iphash 算法:#----------------------------------------------------------workerprocesses 1;events { workerconnections 1024;}http { include mime.types; defaulttype application/octet-stream; sendfile on; keepalivetimeout 65; upstream leilei { iphash; server 10.0.0.64:80; server 10.0.0.65:80; } server { listen 80; servername 10.0.0.66; location / { proxysetheader Host $host; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxypass http://leilei; } errorpage 500 502 503 504 /50x.html; location = /50x.html { root html; } }}#----------------------------------------------------------# iphash 算法会让一个客户端一直访问上一次访问的服务器,除非上一次服务器无法连接才会切换到新的服务器,这是用于绘画保持的一种办法 X-Real-IP $remote_addr; 是用于获取用户浏览器端的IP地址.记录日志.
16.1 反向代理算法
默认权重方式 maxfails=3 failtimeout=20siphash 算法: 这个算法会让同一台资源服务器只为同一台客户端服务. 在这台服务器失效后才会切换到另一台服务器上.在老服务器重新上线后还会继续切换到这台服务器中. 这种算法最大的好处是可以解决 session会话共享的问题.leastconn 把请求转发给连接数较少的后端服务器fair 算法: 按照响应时间最短的提供服务,这个是第三方模块需要进行手动安装.[但是该模块已经在2008年停更,不建议使用]加权轮询算法: 指定轮询比率 weight和访问几率成正比,主要用于后端服务器异质的场景下。urlhash算法: 它与iphash算法类似,只不过它是按照 url 的hash结果来分发请求.可以让每个url都定向到指定后端服务. 配置方式: hash $request_uri;
16.2 反向代理缓存
1. 配置proxycachepath 反向代理缓存的目录mkdir /tmp/proxycache2. nginx配置文件添加缓存参数:proxycachepath /tmp/nginxcache levels=1:2 keyszone=mycache:10m maxsize=10g inactive=60m usetemppath=off;3. 将这个定义的缓存应用到某个反向代理区块中. location / { proxysetheader Host $host; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxypass http://leilei; proxycache mycache; <---定义的缓存 proxycachekey $host$uri$isargs$args; <---定义的缓存 proxycachevalid 200 304 301 302 1d; <---定义的缓存 } 4. 重启nginx服务. 此时 我停止了10.0.0.65这台nginx服务,访问web页面同样显示了 10.0.0.65的处理. 同时也可以看到缓存目录生成了缓存文件: [root@k8s-node2 nginx-1.16.1]# tree /tmp/nginxcache /tmp/nginxcache └── 9 └── e9 └── bffaf06f40da4f9c5cdcdb0860defe99
17. goaccess的使用
wget https://tar.goaccess.io/goaccess-1.3.tar.gztar -xzvf goaccess-1.3.tar.gzcd goaccess-1.3/./configure --enable-utf8 --enable-geoip=legacymakemake install
1. 在server区块下添加一个locationlocation /go.html { alias /application/nginx/html/go.html; }保存后退出2. 在nginx 网页目录添加 一个 go.html ,确保它可以被访问 touch /application/nginx/html/go.htm3. 创建go.sh脚本#-----------------------goaccess日志----------------#!/bin/shLANG="zh_CN.UTF-8" #页面转换为中文/usr/local/bin/goaccess /application/nginx/logs/access.log -o /application/nginx/html/go.html -p /usr/local/etc/goaccess/goaccess.conf#-----------------------goaccess日志----------------计划任务 [一分钟一次] 4. 把命令配置为定时任务 [root@leilei html]# crontab -l /1 * /bin/bash /root/go.sh > /dev/null 2>&1 &
划线
评论
复制
发布于: 2020 年 04 月 28 日阅读数: 81
陈雷雷
关注
还未添加个人签名 2019.07.04 加入
还未添加个人简介
评论