Nginx从零开始

Nginx简介

1、Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

2、反向代理

正向代理:通过代理服务器进行网络访问,比如VPN,相当于代理访问。

反向代理:反向代理服务器和目标服务器可以看作是一个服务器,相当于请求转发

3、负载均衡

增加服务器的数量,将请求转发按照一定规则转发到不同的服务器上

4、动静分离

反向代理服务器可以部署静态资源,一般前端项目就可以部署在nginx上面,将动态资源和静态资源分开部署。

5、高可用

Nginx安装

  1. 下载nginx安装包 nginx-1.23.3.tar.gz

2、下载安装相关依赖素材

  • 安装pcre依赖:把压缩文件放在linux系统中,进入压缩文件存放目录,解压文件tar -xvf pcre-8.37.tar.gz,进入解压之后的目录cd pcre,输入./configure,输入make && make install编译安装。(查看版本号pcre-config --version)

  • 安装其他的依赖:如果已经联网:使用yum命令yum -y install make zlib alib-devel gcc-c++ libtool openssl openssl -devel

3、安装nginx

解压缩nginx包,进入解压缩目录。执行./configure,输入make && make install

也可以安装的时候初始化文件路径:

./configure --prefix=/usr --with-stream --pid-path=/var/run/nginx.pid  --conf-path=/etc/nginx/nginx.conf
nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/var/run/nginx/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

cd /usr/local/nginx/sbin 启动nginx:./nginx

查看开放端口号:

firewall-cmd --list-all

设置开放端口号:

firewall-cmd --add-service=http -permanent

sudo firewall-cmd --add-port=80/tcp --permanent

重启防火墙

firewall-cmd -reload

Nginx常用操作命令

进入nginx的目录:cd /usr/local/nginx

查看nginx版本号:./nginx -v

启动nginx:./nginx

关闭nginx:./nginx -s stop

重启nginx:./nginx -s reload

判断nginx是否准备就绪:./nginx -t

Nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

配置文件的组成

第一部分:全局块

从文件开始到events块之间的内容比如worker processes

第二部分:events块

主要影响nginx服务器与用户的网络连接

比如worker_connections 1024 支持的最大连接数

第三部分:http块

  1. http全局块:包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。

  1. service块:这块和虚拟主机有密切的关系

  • 全局service块

  • location

Nginx配置实例

反向代理

实例一

  1. 达成效果

2、nginx请求转发的配置

  • 将server_name改成ip192.168.17.129

实例二

1、达成效果

nginx监听9001

2、nginx请求转发的配置

  • 增加一个server块

  • 开放对外访问的端口号sudo firewall-cmd --add-port=8081/tcp --permanent...

负载均衡

1、达成效果

浏览器输入地址http://192.168.17.129/edu/a.html,负载均衡效果,平均分配到8080和8081端口中

2、nginx请求转发的配置

  • 先加上upstream块

upstream myserver{
	server 192.168.17.129:8080;
	server 192.168.17.129:8081;
}
  • 修改location里的配置

location / {
	proxy_pass http://myserver;
	...
}

nginx分配策略

  1. 轮询(默认):每个请求按照时间顺序逐一分配到不同服务器,如果有个服务器down,能自动剔除

  1. weight:权重越高分配到的几率更大比如server 192.168.17.129:8080 weight=5;

  1. ip_hash:每个请求按照访问ip的hash结果分配,这样每个方可固定访问一个后端服务器,可以解决session的问题

  1. fair(第三方):按后端服务器的响应时间进行分配。

动静分离

修改nginx配置文件

以统一接入管控维护系统为例

 upstream myproject {
        ip_hash;
        server 10.238.0.92:9753;          				##后端服务地址
        server 10.238.0.93:9753;
 }

server {
    listen       8399;
    server_name  10.127.128.39;      				##前端服务地址

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /home/app/acce;						##解压后的前端文件目录
        index  index.html index.htm;
    }

    location /control{
            proxy_pass http://myproject;            
    }

location匹配规则

~开始正则

*不区分大小写

~*/(css|js|html)

root的处理结果是:root路径+location路径

alias的处理结果是:使用alias路径替换location路径

高可用集群

  1. 问题

  1. 高可用

需要两台nginx服务器,需要keepalived服务

keepalived安装:

  1. 使用yum命令:yum install keepalived -y

位置:/etc/keepalived 配置文件keepalived.conf

2.完成高可用配置(主从模式)

! Configuration File for keepalived
global_defs {                                     #全局定义部分
    notification_email {                          #设置报警邮件地址,可设置多个
        acassen@firewall.loc                      #接收通知的邮件地址
    }                        
    notification_email_from test0@163.com         #设置 发送邮件通知的地址
    smtp_server smtp.163.com                      #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
    smtp_connect_timeout 30                       #设置 连接 smtp server的超时时间
    router_id LVS_DEVEL                           #主机标识,用于邮件通知
    vrrp_skip_check_adv_addr                   
    vrrp_strict                                   #严格执行VRRP协议规范,此模式不支持节点单播
    vrrp_garp_interval 0                       
    vrrp_gna_interval 0     
    script_user keepalived_script                 #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
    enable_script_security                        #如过路径为非root可写,不要配置脚本为root用户执行。
}       

检测存活脚本
vrrp_script chk_nginx_service {                   #VRRP 脚本声明
    script "/etc/keepalived/chk_nginx.sh"         #周期性执行的脚本
    interval 3                                    #运行脚本的间隔时间,秒
    weight -20                                    #权重,priority值减去此值要小于备服务的priority值
    fall 3                                        #检测几次失败才为失败,整数
    rise 2                                        #检测几次状态为正常的,才确认正常,整数
    user keepalived_script                        #执行脚本的用户或组
}                                             
 
vrrp_instance VI_1 {                              #vrrp 实例部分定义,VI_1自定义名称
    state MASTER                                  #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface ens33                               #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                          #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 100                                  #定义优先级,数字越大,优先级越高。
    advert_int 1                                  #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                              #设置验证类型和密码,两个节点必须一致
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                           #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.119.130                       
    }
    track_script {                                #脚本监控状态
        chk_nginx_service                         #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
        notify_master "/etc/keepalived/start_haproxy.sh start"  #当前节点成为master时,通知脚本执行任务
        notify_backup "/etc/keepalived/start_haproxy.sh stop"   #当前节点成为backup时,通知脚本执行任务
        notify_fault  "/etc/keepalived/start_haproxy.sh stop"   #当当前节点出现故障,执行的任务; 
}                                             
 
virtual_server 192.168.119.130 80  {          #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
    delay_loop 6                              #每隔6秒查询realserver状态
    lb_algo rr                                #后端调试算法(load balancing algorithm)
    lb_kind DR                                #LVS调度类型NAT/DR/TUN
    #persistence_timeout 60                   同一IP的连接60秒内被分配到同一台realserver
    protocol TCP                              #用TCP协议检查realserver状态
    real_server 192.168.119.120 80 {          
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }                                     
    }                                         
}                                             
 
vrrp_instance VI_2 {                          #vrrp 实例部分定义,VI_1自定义名称
    state   BACKUP                            #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
    interface ens33                           #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 52                      #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 90                               #定义优先级,数字越大,优先级越高。
    advert_int 1                              #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                          #设置验证类型和密码,两个节点必须一致
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.119.131                       
    }                                         
}                                             
 
virtual_server 192.168.119.131 80 {           #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
    delay_loop 6                              #每隔6秒查询realserver状态
    lb_algo rr                                #后端调试算法(load balancing algorithm)
    lb_kind DR                                #LVS调度类型NAT/DR/TUN
    #persistence_timeout 60                   #同一IP的连接60秒内被分配到同一台realserver
    protocol TCP                              #用TCP协议检查realserver状态
    real_server 192.168.119.120 80 {          
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }
    }
}

3.nginx存活检测脚本chk_nginx.sh配置

#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
            # 尝试启动一次
            systemctl start nginx
        # 再次检查ngixn 进程
        status2=$(ps -C nginx --no-heading|wc -l)
        if [ "${status2}" = "0"  ]; then
                # 关闭 keepalived 
                systemctl stop keepalived
        fi
fi

4.给脚本一个可执行权限

# 给脚本一个 可执行的权限
chmode +x /etc/keepalived/nginx_check.sh 

5.启用keepalived和nginx

systemctl start keepalived.service

Nginx日志配置

设置access_log

访问⽇志主要记录客⼾端的请求。客⼾端向Nginx服务器发起的每⼀次请求都记录在这⾥。客⼾端IP,浏览器信息,referer,请 求处理时间,请求URL等都可以在访问⽇志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。

语法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问⽇志
access_log off; # 关闭访问⽇志
  • path 指定⽇志的存放位置。

  • format 指定⽇志的格式。默认使⽤预定义的combined。

  • buffer ⽤来指定⽇志写⼊时的缓存⼤⼩。默认是64k。

  • gzip ⽇志写⼊前先进⾏压缩。压缩率可以指定,从1到9数值越⼤压缩⽐越⾼,同时压缩的速度也越慢。默认是1。

  • flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。

  • if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写⼊⽇志。

另外,还有⼀个特殊的值off。如果指定了该值,当前作⽤域下的所有的请求⽇志都被关闭。

作用域

可以应⽤access_log指令的作⽤域分别有http,server,location,limit_except。也就是说,在这⼏个作⽤域外使⽤该指 令,Nginx会报错。 以上是access_log指令的基本语法和参数的含义。下⾯我们看⼀⼏个例⼦加深⼀下理解。

基本语法

access_log /var/logs/nginx-access.log 

该例⼦指定⽇志的写⼊路径为/var/logs/nginx-access.log,⽇志格式使⽤默认的combined。

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m 

该例⼦指定⽇志的写⼊路径为/var/logs/nginx-access.log,⽇志格式使⽤默认的combined,指定⽇志的缓存⼤⼩为32k,⽇志 写⼊前启⽤gzip进⾏压缩,压缩⽐使⽤默认值1,缓存数据有效时间为1分钟。

使⽤log_format⾃定义⽇志格式

Nginx预定义了名为combined⽇志格式,如果没有明确指定⽇志格式默认使⽤该格式:

log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

如果不想使⽤Nginx预定义的格式,可以通过log_format指令来⾃定义

log_format name [escape=default|json] string ...;
  • name 格式名称。在access_log指令中引⽤。

  • escape 设置变量中的字符编码⽅式是json还是default,默认是default。

  • string 要定义的⽇志格式内容。该参数可以有多个。参数中可以使⽤Nginx变量。

下⾯是log_format指令中常⽤的⼀些变量:

 $remote_addr  #记录访问网站的客户端地址

 $remote_user  #远程客户端用户名

 $time_local  #记录访问时间与时区

 $request  #用户的http请求起始行信息

 $status  #http状态码,记录请求返回的状态码,例如:200、301、404等

 $body_bytes_sent  #服务器发送给客户端的响应body字节数

 $http_referer  #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。

 $http_user_agent  #记录客户端访问信息,例如:浏览器、手机客户端等

 $http_x_forwarded_for  #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置

设置error_log

错误⽇志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息

语法

配置错误⽇志⽂件的路径和⽇志级别

error_log file [level];
Default:
error_log logs/error.log error;

第⼀个参数指定⽇志的写⼊位置。

第⼆个参数指定⽇志的级别。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值范围 是按紧急程度从低到⾼排列的。只有⽇志的错误级别等于或⾼于level指定的值才会写⼊错误⽇志中。默认值是error。

基本用法

error_log /var/logs/nginx/nginx-error.log

它可以配置在:main, http, mail, stream, server, location作⽤域。 例⼦中指定了错误⽇志的路径为: /var/logs/nginx/nginx-error.log ,⽇志级别使⽤默认的error。

日志切割

手动切割

利用shell脚本文件

现有的日志文件存在access.log文件中,随着时间的推移,这个文件会越来越大,不便于运维人员查看,可以把这个大的日志文件切割成若干个小的文件,切割规则可以以时间为单位。

  1. 创建一个shell可执行文件:cut_my_log.sh,内容:

#!/bin/bash
#此脚本用于自动分割Nginx的日志,包括access.log和error.log
#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
#Nginx日志文件所在目录
LOG_PATH="/var/log/nginx"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
#向nginx主进程发送信号,用于重新打开日志文件
kill -USR1 'cat $PID'
  1. 为cut_my_log.sh添加可执行权限:

chmod +x cut_my_log.sh
  1. 运行脚本文件,进行切割

./cut_my_log

自动切割

  1. 安装定时任务

yum install crontabs
  1. crontab -e 编辑并且添加一行新的任务(按分钟):

*/1 * * * */usr/local/nginx/sbin/cut_my_log.sh
00 00 *...按天切割
  1. 重启定时任务

service crond restart

使用logrotate工具

  1. 创建nginx配置文件

vi /etc/logrotate.d/nginx
  1. 文件内容如下

/usr/local/nginx/logs/access.log {
    su root root
    create 0664 nginx root
    daily
    dateext
    rotate 30
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
  1. 测试

/usr/sbin/logrotate -f /etc/logrotate.d/nginx
  1. 配置定时任务

59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
  1. 补充说明:(全局参数)

weekly : 每周执行回滚,或者说每周执行一次日志回滚

rotate: 表示日志切分后历史文件最多保存离现在最近的多少份 [rəʊˈteɪt] 旋转

create : 指定新创建的文件的权限与所属主与群组

dateext : 使用日期为后缀的回滚文件 #可以去/var/log目录下看看

单独配置信息:

/var/log/btmp { 指定的日志文件的名字和路径

missingok 如果文件丢失,将不报错

monthly 每月轮换一次

create 0664 root utmp 设置btmp这个日志文件的权限,属主,属组

minsize 1M 文件超过1M进行回滚,所以大家要知道它不一定每个月都会进行分割,要看这个文件大小来定

rotate 1 日志切分后历史文件最多保存1份,不含当前使用的日志

其它参数说明:

monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。

rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。

compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。

delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。

missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

notifempty: 如果日志文件为空,轮循不会进行。

create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。

postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

/var/lib/logrotate/status中默认记录logrotate上次轮换日志文件的时间。原文链接:https://blog.csdn.net/weixin_39566578/article/details/111509796

注意:

copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。

区别是如果进程,比如nginx 使用了一个文件写日志,没有copytruncate的话,切割日志时, 把旧日志log->log.1 ,然后创建新日志log。这时候nginx 打开的文件描述符依然时log.1,由没有信号通知nginx 要换日志描述符,所以它会继续向log.1写日志,这样就不符合我们的要求了。 因为我们想切割日志后,nginx 自动会向新的log 文件写日志,而不是旧的log.1文件

解决方法有两个:

1.向上面的nginx 切割日志配置,再postrotate里面写个脚本

postrotate # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行

 [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`

endscript

这样就是发信号给nginx ,让nginx 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志

Nginx优化

1、把worker数量设置成cpu的数量是最合适的。

2、发送请求,占用woker的几个连接数?——2或者4个

3、nginx有一个master,有四个worker,每个worker支持最大的连接数是1024,支持最大的并发数是多少?——1024*4/(2|4)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值