nginx基础安装使用和负载均衡高可用,日志切割配置

Posted 陈雷雷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx基础安装使用和负载均衡高可用,日志切割配置相关的知识,希望对你有一定的参考价值。

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 &

以上是关于nginx基础安装使用和负载均衡高可用,日志切割配置的主要内容,如果未能解决你的问题,请参考以下文章

Nginx的继续深入(日志轮询切割,重写,负载均衡等)

Ubuntu下keepalived和nginx实现高可用性负载均衡

Ubuntu下keepalived和nginx实现高可用性负载均衡

实战安装 nginx+keepalvied 实现负载均衡和高可用

nginx+keepalived实现高可用负载均衡

SignalR集群采用Nginx进行负载均衡后连接失败