写点什么

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.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1

[root@k8s-node2 Nginx-1.16.1]# ll
total 752
drwxr-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-devel
wget http://Nginx.org/download/nginx-1.16.1.tar.gz
tar 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_module
make
make install



6.3. 默认配置文件内容



[root@k8s-node2 Nginx-1.16.1]# egrep -v "#|^$" /usr/local/Nginx-1.16.1/conf/Nginx.conf
workerprocesses 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 0
drwx------ 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]# ll
total 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] 平滑重启nginx
kill -WINCH [进程id] 等待进程结束后关闭nginx[常用于nginx版本升级]
kill -QUIT [进程id] 优雅退出,执行完当前的请求后退出



10.Nginx版本升级



1. 下载新版本nginx
2. 获取老版本nginx编译参数[nginx -V]
3. 拿到编译参数编译新版本nginx
4. 编译完成后,将老版本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}.log
mv ${LOGPATH}error.log ${LOGPATH}error-${YESTERDAY}.log
#向nginx发送reopen信号,只重新记录日志文件[建议用reopen而不是reload.]
nginx -s reopen
#---------------------------------------------------------------------------------------

#脚本配置完毕,每天执行即可
crontab -e
00 00 /bin/sh cutlog.sh

echo "00 00 /bin/sh cutlog.sh" >>/var/spool/cron/root



陶辉写法: vi curlog.sh
1. 脚本:
#!/bin/bash
LOGPATH=/application/nginx/logs/history
CUTLOG=/application/nginx/logs
time=$(date -d "yesterday" +%Y-%m-%d)
cp -a ${CUTLOG}/accesslog ${LOGPATH}/access${time}.log
cp -a ${CUTLOG}/errorlog ${LOGPATH}/error${time}.log
kill -USR1 $(cat /application/nginx/logs/nginx.pid)

2.权限
chmod +x /bin/sh cutlog.sh

3.计划任务
crontab -e
00 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 nginx1
10.0.0.65 nginx2
10.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=20s

iphash 算法: 这个算法会让同一台资源服务器只为同一台客户端服务. 在这台服务器失效后才会切换到另一台服务器上.在老服务器重新上线后还会继续切换到这台服务器中. 这种算法最大的好处是可以解决 session会话共享的问题.

leastconn 把请求转发给连接数较少的后端服务器

fair 算法: 按照响应时间最短的提供服务,这个是第三方模块需要进行手动安装.[但是该模块已经在2008年停更,不建议使用]

加权轮询算法: 指定轮询比率 weight和访问几率成正比,主要用于后端服务器异质的场景下。

urlhash算法: 它与iphash算法类似,只不过它是按照 url 的hash结果来分发请求.可以让每个url都定向到指定后端服务.
配置方式: hash $request_uri;



16.2 反向代理缓存



1. 配置proxycachepath 反向代理缓存的目录
mkdir /tmp/proxycache

2. 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.gz
tar -xzvf goaccess-1.3.tar.gz
cd goaccess-1.3/
./configure --enable-utf8 --enable-geoip=legacy
make
make install



1. 在server区块下添加一个location

location /go.html {
alias /application/nginx/html/go.html;
}

保存后退出

2. 在nginx 网页目录添加 一个 go.html ,确保它可以被访问
touch /application/nginx/html/go.htm

3. 创建go.sh脚本
#-----------------------goaccess日志----------------
#!/bin/sh
LANG="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 &



用户头像

陈雷雷

关注

还未添加个人签名 2019.07.04 加入

还未添加个人简介

评论

发布
暂无评论
Nginx学习