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中的功能模块都会在 ngx_modules.c 文件中.
查看 ngx_modules.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-http_stub_status_module --with-http_ssl_module
make
make install
6.3. 默认配置文件内容
[root@k8s-node2 Nginx-1.16.1]# egrep -v "#|^$" /usr/local/Nginx-1.16.1/conf/Nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 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 client_body_temp #临时文件目录
drwxr-xr-x 2 root root 333 Apr 11 23:20 conf #Nginx配置文件目录
drwx------ 2 nobody root 6 Apr 11 23:21 fastcgi_temp #临时文件目录
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 proxy_temp #临时文件目录
drwxr-xr-x 2 root root 36 Apr 12 00:16 sbin #Nginx二进制文件目录
drwx------ 2 nobody root 6 Apr 11 23:21 scgi_temp #临时文件目录
drwx------ 2 nobody root 6 Apr 11 23:21 uwsgi_temp #临时文件目录
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 fastcgi_params #fastcgi_params配置文件
-rw-r--r-- 1 root root 1007 Apr 12 00:16 fastcgi_params.default #fastcgi_params默认配置文件
-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 scgi_params #cgi接口
-rw-r--r-- 1 root root 636 Apr 12 00:16 scgi_params.default #cgi接口
-rw-r--r-- 1 root root 664 Apr 11 23:20 uwsgi_params #fastcgi文件
-rw-r--r-- 1 root root 664 Apr 12 00:16 uwsgi_params.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脚本来生成自定义日志文件.
保存为 cut_log.sh
#---------------------------------------------------------------------------------------
#!/bin/bash
#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
#Nginx日志文件所在目录
LOG_PATH=/application/nginx/logs
#获取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#获取pid文件路径
PID=/var/run/nginx/nginx.pid
#分割日志
mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log
mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log
#向nginx发送reopen信号,只重新记录日志文件[建议用reopen而不是reload.]
nginx -s reopen
#---------------------------------------------------------------------------------------
#脚本配置完毕,每天执行即可
crontab -e
00 00 * * * /bin/sh cut_log.sh
或
echo "00 00 * * * /bin/sh cut_log.sh" >>/var/spool/cron/root
陶辉写法: vi cur_log.sh
1. 脚本:
#!/bin/bash
LOG_PATH=/application/nginx/logs/history
CUT_LOG=/application/nginx/logs
time=$(date -d "yesterday" +%Y-%m-%d)
cp -a ${CUT_LOG}/access_log ${LOG_PATH}/access_${time}.log
cp -a ${CUT_LOG}/error_log ${LOG_PATH}/error_${time}.log
kill -USR1 $(cat /application/nginx/logs/nginx.pid)
2.权限
chmod +x /bin/sh cut_log.sh
3.计划任务
crontab -e
00 00 * * * /bin/sh cut_log.sh
12. nginx 优化
12.1 gzip压缩
配置在 http server location 区块
gzip on;
gzip_min_length 500;
gzip_buffers 4 256k;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_types 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;
gzip_vary on;
gzip_proxied 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区块定义:
log_format leilei \'$remote_addr - $remote_user [$time_local]\'
\'"$request" $status $body_bytes_sent\'
\'"$http_referer" - "$http_x_forwarded_for" - "$http_user_agent"\';
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 算法:
#----------------------------------------------------------
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream leilei {
ip_hash;
server 10.0.0.64:80;
server 10.0.0.65:80;
}
server {
listen 80;
server_name 10.0.0.66;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://leilei;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
#----------------------------------------------------------
# ip_hash 算法会让一个客户端一直访问上一次访问的服务器,除非上一次服务器无法连接才会切换到新的服务器,这是用于绘画保持的一种办法
X-Real-IP $remote_addr; 是用于获取用户浏览器端的IP地址.记录日志.
16.1 反向代理算法
默认权重方式 max_fails=3 fail_timeout=20s
ip_hash 算法: 这个算法会让同一台资源服务器只为同一台客户端服务. 在这台服务器失效后才会切换到另一台服务器上.在老服务器重新上线后还会继续切换到这台服务器中. 这种算法最大的好处是可以解决 session会话共享的问题.
least_conn 把请求转发给连接数较少的后端服务器
fair 算法: 按照响应时间最短的提供服务,这个是第三方模块需要进行手动安装.[但是该模块已经在2008年停更,不建议使用]
加权轮询算法: 指定轮询比率 weight和访问几率成正比,主要用于后端服务器异质的场景下。
url_hash算法: 它与ip_hash算法类似,只不过它是按照 url 的hash结果来分发请求.可以让每个url都定向到指定后端服务.
配置方式: hash $request_uri;
16.2 反向代理缓存
1. 配置proxy_cache_path 反向代理缓存的目录
mkdir /tmp/proxy_cache
2. nginx配置文件添加缓存参数:
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
3. 将这个定义的缓存应用到某个反向代理区块中.
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://leilei;
proxy_cache my_cache; <---定义的缓存
proxy_cache_key $host$uri$is_args$args; <---定义的缓存
proxy_cache_valid 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/nginx_cache
/tmp/nginx_cache
└── 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 &