nginx

nginx

    • 1. nginx简介
    • 2. nginx的特性与优点
      • 2.1 nginx的特性
      • 2.2 nginx的优点
    • 3. nginx的功能及应用类别
      • 3.1 nginx的基本功能
      • 3.2 nginx的扩展功能
      • 3.3 nginx的应用类别
    • 4. nginx的模块与工作原理
      • 4.1 nginx的模块分类
      • 4.2 nginx的工作原理
    • 5.nginx的安装与配置
      • 5.1 nginx的安装
      • 5.2 nginx安装后配置
      • 5.3 使用ip访问网页测试效果
    • 6. nginx的配置文件详解
      • 6.1 nginx.conf配置详解
      • 6.2 用于调试、定位问题的配置参数
      • 6.3 正常运行必备的配置参数
      • 6.4 优化性能的配置参数
      • 6.5 事件相关的配置:event{}段中的配置参数
      • 6.6 网络连接相关的配置参数
      • 6.7 fastcgi的相关配置参数
      • 6.8 常需要进行调整的参数
      • 6.9 nginx作为web服务器时使用的配置:http{}段的配置参数
      • 6.10 错误页面配置
      • 6.11 平滑升级
      • 6.12 location配置
      • 6.13 访问控制
      • 6.14 基于用户认证
      • 6.15 https配置
      • 6.16 开启状态界面
      • 6.17 状态页面监控与配置
      • 6.18 配置zabbix页面
      • 6.19 rewrite
        • 6.19.1 break示例1
        • 6.19.2 break示例2
        • 6.19.3 redirect示例1
        • 6.19.4 last和break组合使用示例1
        • 6.19.5 last和break组合使用示例2
        • 6.19.6 redirect示例
        • 6.19.7 permanent示例
      • 6.20 if
        • 6.20.1 基于浏览器实现分离案例
        • 6.20.2 防盗链案例
      • 6.21 反向代理与负载均衡
      • 6.22 配置反向代理与负载均衡
      • 6.23 动静分离

1. nginx简介

nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。

第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2. nginx的特性与优点

2.1 nginx的特性

nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:

  • 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
  • 使用epoll and kqueue作为开发模型
  • nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
  • nginx采用C语言进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

2.2 nginx的优点

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
  • 配置文件非常简单:风格跟程序一样通俗易懂
  • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
  • 稳定性高:用于反向代理,宕机的概率微乎其微
  • 模块化设计:模块可以动态编译
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:可以不停机重载配置文件
  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

3. nginx的功能及应用类别

3.1 nginx的基本功能

  • 静态资源的web服务器,能缓存打开的文件描述符
  • http、smtp、pop3协议的反向代理服务器
  • 缓存加速、负载均衡
  • 支持FastCGI(fpm,LNMP),uWSGI(Python)等
  • 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
  • 支持SSL

3.2 nginx的扩展功能

  • 基于名称和IP的虚拟主机
  • 支持keepalive
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提高日志存储性能
  • 支持URL重写
  • 支持路径别名
  • 支持基于IP及用户的访问控制
  • 支持速率限制,支持并发数限制

3.3 nginx的应用类别

  • 使用nginx结合FastCGI运行PHP、JSP、Perl等程序
  • 使用nginx作反向代理、负载均衡、规则过滤
  • 使用nginx运行静态HTML网页、图片
  • nginx与其他新技术的结合应用

4. nginx的模块与工作原理

nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

4.1 nginx的模块分类

nginx的模块从结构上分为核心模块、基础模块和第三方模块

  • HTTP模块、EVENT模块和MAIL模块等属于核心模块
  • HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
  • HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块

用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大

nginx模块从功能上分为三类,分别是:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
  • Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
  • Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能

nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等

  • nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
    • 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部(每行命令开头的上一行)
    • 事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
    • 配置模块:提供包含机制

具体的指令,请参考nginx的官方文档

4.2 nginx的工作原理

nginx的模块直接被编译进nginx,因此属于静态编译方式。

启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。

在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

nginx的进程架构:
启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request

nginx_第1张图片

下图展示了nginx模块一次常规的HTTP请求和响应的过程

nginx_第2张图片

下图展示了基本的WEB服务请求步骤

nginx_第3张图片
(1)建立连接 — 接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
(2)接收请求 — 从网络中读取一条 HTTP 请求报文。
(3)处理请求 — 对请求报文进行解释,并采取行动。
(4)访问资源 — 访问报文中指定的资源。
(5)构建响应 — 创建带有正确首部的 HTTP 响应报文。
(6)发送响应 — 将响应回送给客户端。
(7)记录事务处理过程 — 将与已完成事务有关的内容记录在一个日志文件中。

5.nginx的安装与配置

5.1 nginx的安装

//关闭防火墙与SELINUX
[root@localhost ~]# systemctl disable --now firewalld
[root@localhost ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# reboot

//创建系统用户nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

//安装依赖环境
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@localhost ~]# yum -y groups mark install 'Development Tools'

//创建日志存放目录
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

//下载nginx
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
--2021-10-23 21:45:53--  http://nginx.org/download/nginx-1.20.1.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1061461 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.20.1.tar.gz”

100%[=============================================================================>] 1,061,461   26.2KB/s 用时 17s    

2021-10-23 21:46:11 (61.7 KB/s) - 已保存 “nginx-1.20.1.tar.gz” [1061461/1061461])


//编译安装
[root@localhost src]# ls
debug  kernels  nginx-1.20.1.tar.gz
[root@localhost src]# tar xf nginx-1.20.1.tar.gz 
[root@localhost src]# cd nginx-1.20.1
[root@localhost nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log

[root@localhost nginx-1.20.1]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
安装过程略....

5.2 nginx安装后配置

//配置环境变量
[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# . /etc/profile.d/nginx.sh
[root@localhost ~]# which nginx
/usr/local/nginx/sbin/nginx


//服务控制方式,使用nginx命令
    -t  //检查配置文件语法
    -v  //输出nginx的版本
    -c  //指定配置文件的路径
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload}

-t

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

-v -V

[root@localhost ~]# nginx -v
nginx version: nginx/1.21.3
[root@localhost ~]# nginx -V
nginx version: nginx/1.21.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

-c

[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# cp mime.types nginx.conf /opt/
[root@localhost conf]# nginx -s stop; nginx -c /opt/nginx.conf
[root@localhost conf]# ps -ef | grep nginx
root       6834      1  0 18:19 ?        00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx      6835   6834  0 18:19 ?        00:00:00 nginx: worker process
nginx      6836   6834  0 18:19 ?        00:00:00 nginx: worker process
root       7061   1494  0 18:20 pts/0    00:00:00 grep --color=auto nginx

[root@localhost conf]# nginx -s stop; nginx 		##使用快捷键删除ctrl+w
[root@localhost conf]# ps -ef | grep nginx
root       7935      1  0 18:20 ?        00:00:00 nginx: master process nginx
nginx      7936   7935  0 18:20 ?        00:00:00 nginx: worker process
root       7983   1494  0 18:20 pts/0    00:00:00 grep --color=auto nginx

-s

[root@localhost ~]# nginx -s quit
[root@localhost ~]# ss -anlt
State      Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN     0      128                             *:22                                          *:*                  
LISTEN     0      100                     127.0.0.1:25                                          *:*                  
LISTEN     0      128                            :::22                                         :::*                  
LISTEN     0      100                           ::1:25                                         :::*  

配置.service服务开机自启文件

[root@localhost ~]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
  
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecReload=/bin/kill -HUP  

[Install]
WantedBy=multi-user.target

//重新加载
[root@localhost ~]# systemctl daemon-reload

//启动nginx
[root@localhost ~]# systemctl enable --now nginx
[root@localhost ~]# systemctl status nginx
● nginx.service - nginx
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 六 2021-10-23 22:17:06 CST; 2min 30s ago
 Main PID: 41588 (nginx)
   CGroup: /system.slice/nginx.service
           ├─41588 nginx: master process /usr/local/nginx/sbin/nginx
           └─41589 nginx: worker process

1023 22:17:06 localhost.localdomain systemd[1]: Starting nginx...
1023 22:17:06 localhost.localdomain systemd[1]: Started nginx.

[root@localhost ~]# ss -antl
ss -anlt
State       Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN      0      128                             *:80                                          *:*                  
LISTEN      0      128                             *:22                                          *:*                  
LISTEN      0      100                     127.0.0.1:25                                          *:*                  
LISTEN      0      128                            :::22                                         :::*                  
LISTEN      0      100                           ::1:25                                         :::*     

5.3 使用ip访问网页测试效果

nginx_第4张图片

6. nginx的配置文件详解

主配置文件:/usr/local/nginx/conf/nginx.conf

  • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
  • 可以在启动nginx时通过-c选项来指定要读取的配置文件

nginx常见的配置文件及其作用

配置文件 作用
nginx.conf nginx的基本配置文件
mime.types MIME类型关联的扩展文件
fastcgi.conf 与fastcgi相关的配置
proxy.conf 与proxy相关的配置
sites.conf 配置nginx提供的网站,包括虚拟主机

6.1 nginx.conf配置详解

nginx.conf的内容分为以下几段:

  • main配置段:全局配置段。其中main配置段中可能包含event配置段
  • event {}:定义event模型工作特性
  • http {}:定义http协议相关的配置

配置指令:要以分号结尾,语法格式如下:

derective value1 [value2 ...];

支持使用变量:

  • 内置变量:模块会提供内建变量定义
  • 自定义变量:set var_name value

6.2 用于调试、定位问题的配置参数

daemon {on|off};    		 //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off};     //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别;  	 	 //配置错误日志

error_log里的位置和级别能有以下可选项:

位置 级别
file
stderr
syslog:server=address[,parameter=value]
memory:size
debug:若要使用debug级别,需要在编译nginx时使用–with-debug选项
info
notice
warn
error
crit
alert
emerg

6.3 正常运行必备的配置参数

user USERNAME [GROUPNAME];    	//指定运行worker进程的用户和组
pid /path/to/pid_file;    		//指定nginx守护进程的pid文件
worker_rlimit_nofile number;    //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size;    	//指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
  • user、pid
//nginx安装过后配置文件中的user默认是nobody,但是配置文件中user参数是注释掉的,即使我们把注释去掉,默认user也不是nobody,是nginx
[root@localhost ~]#  ps -ef |grep nginx 
root      13317      1  0 23:17 ?        00:00:00 nginx: master process nginx
nginx     13318  13317  0 23:17 ?        00:00:00 nginx: worker process
nginx     13319  13317  0 23:17 ?        00:00:00 nginx: worker process
nginx     13320  13317  0 23:17 ?        00:00:00 nginx: worker process
root      13395   1488  0 23:17 pts/0    00:00:00 grep --color=auto nginx

[root@localhost ~]# cat /usr/local/nginx/conf/nginx.conf

user  nginx nginx;
worker_processes  3;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;		#取消注释

......
  • worker_rlimit_nofile number
    Linux是有文件句柄限制的(open files),一般默认是1024,当超过这个数量便会报 Too many open files错误,修改nginx参数worker_rlimit_nofile number时,同时也需要修改系统的open file,使用命令ulimit -a可以查看句柄数
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
worker_rlimit_nofile 65535;
......
[root@localhost ~]# nginx -s reload

//增大系统允许打开的文件数,修改系统配置文件
[root@localhost ~]# vim /etc/security/limits.conf 
[root@localhost ~]# tail -2 /etc/security/limits.conf 
*    soft    nofile    65535    #末尾添加此行
*    hard    nofile    65535    #末尾添加此行

[root@localhost ~]# ulimit -a 
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14996
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14996
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

//设置完成以后重开一个终端或者重启即可生效
[root@localhost ~]# ulimit -a 
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14996
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14996
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

6.4 优化性能的配置参数

worker_processes n;    				//启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask ...;    //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:
    0000 0001   //第一颗cpu核心
    0000 0010   //第二颗cpu核心
    0000 0100   //第三颗cpu核心
    0000 1000   //第四颗cpu核心
    0001 0000   //第五颗cpu核心
    0010 0000   //第六颗cpu核心
    0100 0000   //第七颗cpu核心
    1000 0000   //第八颗cpu核心
timer_resolution interval;    //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority number;    	  //指明worker进程的nice值

上下文切换
nice:其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。

  • 配置参数worker_processes、worker_cpu_affinity
    查看本机核心数 top—按数字1
    nginx_第5张图片

配置参数

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
worker_processes  2;
worker_cpu_affinity 0101 1010;
......
[root@localhost ~]# nginx -s stop;nginx 

查看nginx运行在哪
使用命令top,输入L后输入nginx
nginx_第6张图片
nginx_第7张图片
看到nginx进程以后,点击f键
nginx_第8张图片
按q键退出,此时就可以看到进程所对应的核心数
nginx_第9张图片

  • worker_priority(优先级越高获得更多的CPU运行时间,更优先获得CPU运行的机会)
    安装后默认优先级是0,可以再配置文件中修改优先级()
    所有优先级值在0-99范围内,实时进程,而100-139范围内的是非实时进程。
    优先级高的(就是priority数字小的)进程一定会保证先于优先级低的进程执行。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
worker_processes  2;
worker_cpu_affinity 0101 1010;
worker_rlimit_nofile 65535;
worker_priority -20;		#修改优先级为-20
......
[root@localhost ~]# nginx -s stop;nginx

查看修改后的优先级
nginx_第10张图片
在这里插入图片描述

6.5 事件相关的配置:event{}段中的配置参数

accept_mutex {off|on};    //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
lock_file file;    		  //accept_mutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll];  //指明使用的事件模型,建议让nginx自行选择
worker_connections #;    //每个进程能够接受的最大连接数
#以上四个参数,前三个一般配置时选择默认,但是第四个参数worker_connections是一定要配置的
  • worker_connections
    并发量=(worker_processes*worker_connections)/2
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  2;
worker_cpu_affinity 0101 1010;
worker_rlimit_nofile 65535;
worker_priority -20;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  20480;		#最大连接数乘以进程数量除以2就是最大访问并发量300
}

6.6 网络连接相关的配置参数

keepalive_timeout number;    			  //长连接的超时(在65s内没有任何操作)时长,默认为65s
keepalive_requests number;    			  //在一个长连接上所能够允许请求的最大资源数(处理完成后在处理)
keepalive_disable [msie6|safari|none];    //为指定类型的UserAgent禁用长连接
tcp_nodelay on|off;    					  //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number;   		  //读取http请求报文首部的超时时长
client_body_timeout number;  			  //读取http请求报文body部分的超时时长
send_timeout number;    				  //发送响应报文的超时时长
#网络连接我们用的做多的就是前两个(超时、最大资源数)
  • keepalive_timeout number
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
    include       mime.types;
    default_type  application/octet-stream;

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

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;		#默认
  • keepalive_requests number
    设置可以通过一个保持活力连接服务的最大请求数量。请求的最大数目后,连接将关闭。
    定期关闭连接是每个连接内存分配的必要条件。因此,使用过高的最大请求量可能导致内存使用过量,不推荐
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
    include       mime.types;
    default_type  application/octet-stream;

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

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    keepalive_requests 1000;

6.7 fastcgi的相关配置参数

LNMP:php要启用fpm模型
配置示例如下:

location ~ \.php$ {
  root html;
  fastcgi_pass 127.0.0.1:9000;      //定义反向代理,此处的IP地址应该为PHP服务器的地址
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  include fastcgi_params;
}

6.8 常需要进行调整的参数

  • worker_processes 进程数量
  • worker_connections 单个进程能够打开的连接数的数量
  • worker_cpu_affinity cpu核心的绑定
  • worker_priority 进程的优先级

6.9 nginx作为web服务器时使用的配置:http{}段的配置参数

http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:

http {									//协议级别
  include mime.types;
  default_type application/octet-stream;
  keepalive_timeout 65;
  gzip on;
  upstream {							//负载均衡配置
    ...
  }
  server {					//服务器级别,每个server类似于httpd中的一个<VirtualHost>
    listen 80;
    server_name localhost;
    location / {			//请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
      root html;
      index index.html index.htm;
    }
  }
}

http{}段配置指令:
server {}:定义一个虚拟主机,示例如下:

  • http协议包括(upstream server)
  • upstream、server平级
  • server 包括(listen location)
    server {
        listen       8080;	(域名可以给多个)
        server_name  www.hhr.com;

        location / {
            root   html/test;	(网站位置)  or  alias /var/www/html/;(别名一定要写绝对路径,就是把资源放到另外一个位置,当有人访问时,看见的路径是/根下面,其实我们已经放在了另一个位置,防止被攻击)
            index  index.html index.htm;
        }
    }

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# mkdir test
[root@localhost html]# echo 'jjyy' > test/index.html
[root@localhost html]# nginx -s reload
[root@localhost html]# ss -anlt
State      Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN     0      128                             *:80                                          *:*                  
LISTEN     0      128                             *:8080                                        *:*                  
LISTEN     0      128                             *:22                                          *:*                  
LISTEN     0      100                     127.0.0.1:25                                          *:*                  
LISTEN     0      128                            :::22                                         :::*                  
LISTEN     0      100                           ::1:25                                         :::*   

nginx_第11张图片

listen:指定监听的地址和端口

listen address[:port];
listen port;

server_name NAME [...]; 后面可跟多个主机,名称可使用正则表达式或通配符

当有多个server时,匹配顺序如下:

  1. 先做精确匹配检查
  2. 左侧通配符匹配检查,如*.idfsoft.com
  3. 右侧通配符匹配检查,如mail.*
  4. 正则表达式匹配检查,如~ ^.*\.idfsoft\.com$
  5. default_server

root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径

alias path; 用于location配置段,定义路径别名(加绝对路径

index file; 默认主页面

index index.php index.html;
  • lias path 用于location配置段,定义路径别名
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            alias   /var/www/html/;
            index  index.html index.htm;
        }
[root@localhost ~]# mkdir /var/www/html -p
[root@localhost html]# mv /usr/local/nginx/html/test/ .
[root@localhost html]# ls
test
[root@localhost html]# cd test/
[root@localhost test]# ll
总用量 4
-rw-r--r--. 1 root root 5 1027 00:57 index.html	#注意权限让所有人能访问

nginx_第12张图片

6.10 错误页面配置

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
48         error_page  404             /404.html;	#取消注释
......

[root@localhost ~]# vim /usr/local/nginx/html/404.html		#创建自定义错误页面
[root@localhost ~]# cat /usr/local/nginx/html/404.html 
zhe shi yi ge gong yi wangzhan!
[root@localhost ~]# nginx -s  reload

输入一个不存在的网页页面测试
nginx_第13张图片

error_page code [...] [=code] URI | @name` 根据http响应状态码来指明特用的错误页面,例如 `error_page 404 /404_customed.html

nginx_第14张图片

[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404.html

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
 error_page 404 =200 /404.html  
......
[root@localhost ~]# nginx -s  reload

nginx_第15张图片
log_format 定义日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;   #访问日志


//log_format中每一段的含义
remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息

//注意:此处可用变量为nginx各模块内建变量
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf   #取消下列几行的注释
......
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;
......
[root@localhost ~]# nginx -s reload 
[root@localhost ~]# curl 192.168.129.33  # 访问测试

在这里插入图片描述

6.11 平滑升级

1.获取老版本的编译参数-V

[root@localhost ~]# nginx  -V
nginx version: nginx/1.21.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

2.获取新版本或新功能的软件包
下载地址 github.com

[root@localhost ~]#  cd /usr/src/
[root@localhost src]# ls
debug  echo-nginx-module-master.tar  kernels  nginx-1.21.3
[root@localhost src]# tar xf echo-nginx-module-master.tar 
[root@localhost src]# ls
debug  echo-nginx-module-master  echo-nginx-module-master.tar  kernels  nginx-1.21.3

3.对新功能或新版本的软件包进行编译

[root@localhost src]# cd nginx-1.21.3/
[root@nginx nginx-1.21.3]# ./configure   --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../echo-nginx-module-master
[root@nginx nginx-1.21.3]# make

4.备份老程序

[root@localhost nginx-1.21.3]# ll objs/nginx /usr/local/nginx/sbin/nginx 
-rwxr-xr-x. 1 root root 7069888 1027 23:55 objs/nginx
-rwxr-xr-x. 1 root root 6452216 1025 16:25 /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.21.3]# cp /usr/local/nginx/sbin/nginx  /opt/
[root@localhost nginx-1.21.3]# ls /opt/
mime.types  nginx  nginx.conf

5.停掉老程序并用新程序使用老程序的配置文件进行启动

[root@localhost nginx-1.21.3]#  nginx -s stop;objs/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost nginx-1.21.3]# ps -ef|grep nginx
root      62044   1487  0 00:00 pts/0    00:00:00 grep --color=auto nginx

6.检验功能,若无问题即用新程序替换老程序

[root@localhost nginx-1.21.3]# objs/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx-1.21.3]# objs/nginx  -s reload

7.测试

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

		location / {
            root   html;
            index  index.html index.htm;
        }

        location /test {
            echo "test";
        }
[root@localhost nginx-1.21.3]# objs/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx-1.21.3]# objs/nginx -s reload

[root@localhost ~]# curl http://192.168.129.33/test
test

[root@localhost nginx-1.21.3]# \cp objs/nginx /usr/local/nginx/sbin/nginx

[root@localhost nginx-1.21.3]# ll objs/nginx /usr/local/nginx/sbin/nginx 
-rwxr-xr-x. 1 root root 7069888 1027 23:55 objs/nginx
-rwxr-xr-x. 1 root root 7069888 1028 00:12 /usr/local/nginx/sbin/nginx

[root@localhost nginx-1.21.3]# objs/nginx -s stop;nginx
[root@localhost nginx-1.21.3]# ps -ef | grep nginx
root      48446      1  0 00:50 ?        00:00:00 nginx: master process nginx
nginx     48447  48446  0 00:50 ?        00:00:00 nginx: worker process
root      48938   1494  0 00:50 pts/0    00:00:00 grep --color=auto nginx

6.12 location配置

location区段,通过指定模式来与客户端请求的URI相匹配

//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能

//语法:location [ 修饰符 ] pattern {......}

常用修饰符说明:

修饰符 功能
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等

没有修饰符表示必须以指定模式开始,如:

[root@localhost local]# vim nginx/conf/nginx.conf
		location / {
            root   html;
            index  index.html index.htm;
        }

        location /test {
            echo "test";
        }

[root@localhost ~]# nginx -s reload

那么如下内容就可正确匹配:
[root@localhost ~]# curl http://192.168.129.33/test
test
[root@localhost ~]# curl http://192.168.129.33/test/
test
[root@localhost ~]# curl http://192.168.129.33/test?test
test

=:表示必须与指定的模式精确匹配,如:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {				#匹配/test下的所有
            echo "test";
        }
        location =/test {
            echo "111";
        }
[root@localhost ~]# nginx -s reload

那么如下内容就可正确匹配:
[root@localhost ~]# curl http://192.168.129.33/test
111

如下内容则无法匹配:
[root@localhost ~]# curl http://192.168.129.33/test/
test
[root@localhost ~]# curl http://192.168.129.33/test/hh
test
[root@localhost ~]# curl http://192.168.129.33/testtest
test

~:表示指定的正则表达式要区分大小写,如:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            echo "test";
        }
        location ~ ^/test$ {
            echo "大小写";
        }
[root@localhost ~]# nginx -s reload

那么如下内容就可正确匹配:
[root@localhost ~]# curl http://192.168.129.33/test
大小写
如下内容则无法匹配:
[root@localhost ~]# curl http://192.168.129.33/test/
test
[root@localhost ~]# curl http://192.168.129.33/testkllk
test

~*:表示指定的正则表达式不区分大小写,如:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location ~ ^/test$ {
            echo "大小写";
        }
        
[root@localhost ~]# nginx -s reload

那么如下内容就可正确匹配:
[root@localhost ~]# curl http://192.168.129.33/test
不分大小写
[root@localhost ~]# curl http://192.168.129.33/TEST
不分大小写
[root@localhost ~]# curl http://192.168.129.33/TEst
不分大小写

如下内容则无法匹配:
[root@localhost ~]# curl http://192.168.129.33/TEst/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.3</center>
</body>
</html>

[root@localhost ~]# curl http://192.168.129.33/testas
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.3</center>
</body>
</html>

~:类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,则停止搜索其他模式

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            echo "无";
        }
        location ~ ^/test$ {
            echo "分大小写";
        }

        location ~* ^/test$ {
            echo "不分大小写";
        }

[root@localhost ~]# nginx -s reload

那么如下内容就可正确匹配:
[root@localhost ~]# curl http://192.168.129.33/test
分大小写
[root@localhost ~]# curl http://192.168.129.33/tesT
不分大小写
[root@localhost ~]# curl http://192.168.129.33/test/[root@localhost ~]# curl http://192.168.129.33/test/asda[root@localhost ~]# curl http://192.168.129.33/testasda

查找顺序和优先级:由高到底依次为

  1. 带有=的精确匹配优先
  2. 正则表达式按照他们在配置文件中定义的顺序
  3. 带有^~修饰符的,开头匹配
  4. 带有~~*修饰符的,如果正则表达式与URI匹配
  5. 没有修饰符的精确匹配

优先级次序如下:

( location = 路径 ) --> ( location ^~ 路径 ) --> ( location ~ 正则 ) --> ( location ~* 正则 ) --> ( locatio

6.13 访问控制

用于location段
allow:设定允许哪台或哪些主机访问,多个参数间则换行
deny:设定禁止哪台或哪些主机访问,多个参数间则换行
示例:

allow 192.168.1.1/32 ;
allow 192.168.2.1/32 ;
deny all;

示例:

[root@localhost ~]# mkdir /usr/local/nginx/html/test -p
[root@localhost ~]# cat > /usr/local/nginx/html/test/index.html >>EOF
<html>
<head>
<title>test page</title>
</head>
<body>
<a href="http://www.baidu.com">baidu</a>
</body>
</html>
EOF

[root@localhost ~]# nginx -s reload
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            deny   192.168.129.1;	## 黑名单(除了自己谁都能访问)
            root   html;
            index  index.html;
        }
.....
[root@localhost ~]# curl http://192.168.129.33/test/index.html
<html>
<head>
<title>test page</title>
</head>
<body>
<a href="http://www.baidu.com">baidu</a>
</body>
</html>

nginx_第16张图片

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            allow  192.168.129.1;		#白名单(除了自己谁都不能访问)
            deny   all;
            root   html;
            index  index.html;
        }
.....
[root@localhost ~]# curl http://192.168.129.33/test/index.html
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.3</center>
</body>
</html>

nginx_第17张图片

6.14 基于用户认证

auth_basic "欢迎信息";
auth_basic_user_file "/path/to/user_auth_file"

user_auth_file内容格式为:

username:password

这里的密码为加密后的密码串,建议用htpasswd来创建此文件:

htpasswd -c -m /path/to/.user_auth_file USERNAME

示例:

#安装httpd-tools
[root@localhost ~]#  yum -y install httpd-tools
[root@localhost ~]# htpasswd -c -m /usr/local/nginx/conf/.pass admin
New password: 
Re-type new password: 
Adding password for user admin
[root@localhost ~]# id admin
id: admin: no such user			#虚拟用户

[root@localhost ~]# cat /usr/local/nginx/conf/.pass
admin:$apr1$VoP2WB3J$goBaTZ7d.vz9t4NBhIHVi/

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            auth_basic "欢迎信息";
            auth_basic_user_file ".pass";		#写入存放文件路径(如果文件在同级目录,可直接写)
            root   html;
            index  index.html;
        }
[root@localhost ~]# nginx -s reload

nginx_第18张图片

6.15 https配置

生成私钥,生成证书签署请求并获得证书,然后在nginx.conf中配置如下内容:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
  listen       443 ssl;
  server_name  www.idfsoft.com;
  ssl_certificate      /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key  /etc/nginx/ssl/nginx.key;
  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers  on;
  location / {
    root   html;
    index  index.html index.htm;
  }
}

示例:

//CA生成一对密钥
[root@localhost ~]# mkdir /etc/pki/CA
[root@localhost ~]# cd /etc/pki/CA/
[root@localhost CA]# mkdir private
[root@localhost CA]# umask 077;openssl genrsa -out private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
..............+++
.+++
e is 65537 (0x10001)

//CA生成自签署证书
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB  
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:rr  
Organizational Unit Name (eg, section) []:rr
Common Name (eg, your name or your server's hostname) []:hh.example.com         
Email Address []:1@1.com

//生成密钥
[root@localhost CA]# mkdir certs newcerts crl
[root@localhost CA]# touch index.txt && echo 01 > serial
[root@localhost CA]# cd /usr/local/nginx/
[root@localhost nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
[root@localhost nginx]# mkdir ssl
[root@localhost nginx]# #(umask 077;openssl genrsa -out nginx.key 2048)
[root@localhost nginx]# cd ssl
[root@localhost ssl]# (umask 077;openssl genrsa -out nginx.key 2048)
Generating RSA private key, 2048 bit long modulus
......+++
.....+++
e is 65537 (0x10001)

//客户端生成证书签署请求
[root@localhost ssl]# pwd
/usr/local/nginx/ssl
[root@localhost ssl]# ls
nginx.key
[root@localhost ssl]# openssl req -new -key nginx.key -days 365 -out nginx.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:rr
Organizational Unit Name (eg, section) []:rr
Common Name (eg, your name or your server's hostname) []:hh.example.com
Email Address []:1@1.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

//CA签署客户端提交上来的证书
[root@localhost ssl]# openssl ca -in nginx.csr -out nginx.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct 27 18:55:29 2021 GMT
            Not After : Oct 27 18:55:29 2022 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = HB
            organizationName          = rr
            organizationalUnitName    = rr
            commonName                = hh.example.com
            emailAddress              = 1@1.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                FD:98:15:D9:77:26:27:CE:38:4E:76:C5:77:95:98:40:CF:4D:59:C8
            X509v3 Authority Key Identifier: 
                keyid:9D:7A:1A:6D:98:04:0F:27:F9:69:77:F2:CC:C5:1F:20:80:E0:65:AD

Certificate is to be certified until Oct 27 18:55:29 2022 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

[root@localhost ssl]# ls
nginx.crt  nginx.csr  nginx.key

[root@localhost ssl]# rm -f nginx.csr 	#删除掉
[root@localhost ssl]# ls
nginx.crt  nginx.key

//修改nginx配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
		#取消104~121的注释
104     server {
105         listen       443 ssl;
106         server_name  hh.example.com;			#改成域名
107 
108         ssl_certificate      /usr/local/nginx/ssl/nginx.crt;	#可以填写相对路径
109         ssl_certificate_key  /usr/local/nginx/ssl/nginx.key;
110 
111         ssl_session_cache    shared:SSL:1m;
112         ssl_session_timeout  5m;
113 
114         ssl_ciphers  HIGH:!aNULL:!MD5;
115         ssl_prefer_server_ciphers  on;
116 
117         location / {
118             root   html;
119             index  index.html index.htm;
120         }
121     }

[root@localhost ~]# nginx -s reload
[root@localhost ~]# ss -anlt
State      Recv-Q Send-Q   Local Address:Port                  Peer Address:Port              
LISTEN     0      128                  *:80                               *:*                  
LISTEN     0      128                  *:22                               *:*                  
LISTEN     0      100          127.0.0.1:25                               *:*                  
LISTEN     0      128                  *:443                              *:*                  
LISTEN     0      128                 :::22                              :::*                  
LISTEN     0      100                ::1:25                              :::*     

nginx_第19张图片

6.16 开启状态界面

开启status:

location /status {
  stub_status on;
  allow 172.16.0.0/16;
  deny all;
}

示例:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;

        }

        location /status {
            stub_status ;
            allow 192.168.129.33;
        }


        #error_page  404              /404.html;
......
[root@localhost ~]# nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

访问状态页面的方式:http://server_ip/status
nginx_第20张图片
注意
reading值大:很多请求在等待接受 处理能力不够
writing值大 :对端处理能力低、网络慢
waiting值大: 说明工作很闲 处理任务不饱和
waiting值越小越好: 工作饱和 只有几个人在等待,如果没有人等待表示工作不饱和很闲,实际中不会这么浪费 会近可能的给机器安排工作。

状态页面信息详解:

状态码 表示的意义
Active connections 2 当前所有处于打开状态的连接数
accepts 总共处理了多少个连接
handled 成功创建多少握手
requests 总共处理了多少个请求
Reading nginx读取到客户端的Header信息数,表示正处于接收请求状态的连接数
Writing nginx返回给客户端的Header信息数,表示请求已经接收完成, 且正处于处理请求或发送响应的过程中的连接数
Waiting 开启keep-alive的情况下,这个值等于active - (reading + writing), 意思就是Nginx已处理完正在等候下一次请求指令的驻留连接

6.17 状态页面监控与配置

环境说明

主机名 ip 服务 系统
localhost 192.168.129.33 nginx zabbix_agent centos7
Server 192.168.129.250 zabbix_server redhat8

准备工作
localhost 安装nginx、zabbix_agent服务
Server安装zabbix_server服务

详细步骤查看此文章
配置

//修改agent配置文件/usr/local/etc/zabbix_agentd.conf
[root@localhost zabbix-5.4.4]# vim /usr/local/etc/zabbix_agentd.conf
UnsafeUserParameters=1				#取消注释并修改值为1
Server=192.168.129.250
ServerActive=192.168.129.250   		#服务端IP
Hostname=NGINX

//启动服务
[root@localhost zabbix-5.4.4]# zabbix_agentd 
[root@localhost zabbix-5.4.4]# ss -anlt
State      Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN     0      128                     *:10050                               *:*                  
LISTEN     0      128                     *:80                                  *:*                  
LISTEN     0      128                     *:22                                  *:*                  
LISTEN     0      100             127.0.0.1:25                                  *:*                  
LISTEN     0      128                     *:443                                 *:*                  
LISTEN     0      128                    :::22                                 :::*                  
LISTEN     0      100                   ::1:25                                 :::*    

//编写的脚本
[root@localhost ~]# mkdir /scripts
[root@localhost ~]# vim /scripts/check_status.sh
#!/bin/bash
if [ `curl -s http://192.168.129.33/status|awk 'NR==4 {print $6}' ` -gt 30 ]
then
    echo "1"
else
    echo "0"
fi

[root@localhost ~]# chmod +x /scripts/check_status.sh 
[root@localhost ~]# chown -R zabbix.zabbix /scripts/check_status.sh 
[root@localhost ~]# ll
总用量 4
-rwxr-xr-x. 1 zabbix zabbix 127 1028 22:30 check_status.s

测试脚本

[root@localhost ~]# ./scripts/check_status.sh 
0

配置zabbix配置文件

[root@localhost ~]# vim /usr/local/etc/zabbix_agentd.conf
写入以下:
UserParameter=check_status[*],/scripts/check_status.sh $1		#取消331行的注释并添加内容
[root@localhost ~]# pkill zabbix
[root@localhost ~]# zabbix_agentd

服务端测试

[root@Server ~]# zabbix_get -s 192.168.129.33 -k check_status		#服务端测试
0

6.18 配置zabbix页面

创建主机
nginx_第21张图片
nginx_第22张图片
创建监控项
nginx_第23张图片
nginx_第24张图片
nginx_第25张图片
nginx_第26张图片
创建触发器
nginx_第27张图片
nginx_第28张图片
nginx_第29张图片
nginx_第30张图片
nginx_第31张图片
添加触发器
nginx_第32张图片
nginx_第33张图片
nginx_第34张图片
nginx_第35张图片
nginx_第36张图片

6.19 rewrite

语法:rewrite regex replacement flag;,如:

rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;

此处的$1用于引用(.*.jpg)匹配到的内容,又如:

rewrite ^/bbs/(.*)$ http://www.idfsoft.com/index.html redirect;

如上例所示,replacement可以是某个路径,也可以是某个URL

常见的flag

flag 作用
last 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个 一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理 而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
break 中止Rewrite,不再继续匹配 一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求, 且不再会被当前location内的任何rewrite规则所检查
redirect 以临时重定向的HTTP状态302返回新的URL
permanent 以永久重定向的HTTP状态301返回新的URL

rewrite模块的作用是用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优化(SEO)

6.19.1 break示例1

  • break 本条规则匹配完成即终止,不再匹配后面的任何规则
[root@localhost ~]# /usr/local/nginx/html/
[root@localhost html]# mkdir imgs
[root@localhost html]# ls
50x.html  imgs  index.html  test
[root@localhost html]# ls images/
1.gif  2.webp


[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /images {
            rewrite ^/images/(.*\.webp)$ /imgs/$1 break;
        }

        #error_page  404              /404.html;
 ......
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问测试
nginx_第37张图片

6.19.2 break示例2

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /images {
            rewrite ^/images/(.*\.webp)$ https://www.linuxprobe.com/wp-content/uploads/2020/05/2653e3c945f3ca8b91108ccf35b8aa81.jpg-wh_651x-s_3754039934.jpg break;
        }

        #error_page  404              /404.html;
 ......
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问测试
nginx_第38张图片

6.19.3 redirect示例1

  • redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir imgs
[root@localhost html]# ls
404.html  50x.html  imgs  index.html
[root@localhost imgs]# ls
1.gif  2.webp

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
               #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /images {
            rewrite ^/images/(.*\.webp)$ http://images.baidu.com/ redirect;
        }

        #error_page  404              /404.html;
 ......
 
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问测试
nginx_第39张图片

6.19.4 last和break组合使用示例1

  • last 本条规则匹配完成后,继续向下匹配新的location URI规则
  • break 本条规则匹配完成即终止,不再匹配后面的任何规则
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir imgs
[root@localhost html]# ls
404.html  50x.html  imgs  index.html
[root@localhost imgs]# ls
1.gif  2.webp

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
               #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /images {
            rewrite ^/images/(.*\.webp)$ /imgs/$1 last;
        }

        location /imgs {
            rewrite ^/imgs/(.*\.webp)$ http://images.baidu.com/ last;
        }

        #error_page  404              /404.html;
 ......
 
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问

  • 发现访问到第二条规则的页面

6.19.5 last和break组合使用示例2

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir imgs
[root@localhost html]# ls
404.html  50x.html  imgs  index.html
[root@localhost imgs]# ls
1.gif  2.webp

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
               #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /images {
            rewrite ^/images/(.*\.webp)$ /imgs/$1 break;
        }

        location /imgs {
            rewrite ^/imgs/(.*\.webp)$ http://images.baidu.com/ last;
        }

        #error_page  404              /404.html;
 ......
 
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问

  • 发现访问到第一条规则的页面
    nginx_第40张图片

6.19.6 redirect示例

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
               #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /images {
            rewrite ^/images/(.*\.webp)$ /imgs/$1 redirect;
        }
        #error_page  404              /404.html;
 ......
 
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问

  • 状态码变成302
    nginx_第41张图片

6.19.7 permanent示例

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
               #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /images {
            rewrite ^/images/(.*\.webp)$ /imgs/$1 permanent;
        }
        #error_page  404              /404.html;
 ......
 
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload

浏览器访问

  • 状态码变成301
    nginx_第42张图片

nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:

标识符 意义
^ 必须以^后的实体开头
$ 必须以$前的实体结尾
. 匹配任意字符
[] 匹配指定字符集内的任意字符
[^] 匹配任何不包括在指定字符集内的任意字符串
| 匹配 | 之前或之后的实体
() 分组,组成一组用于匹配的实体,通常会有 | 来协助

捕获子表达式,可以捕获放在()之间的任何文本,比如:

^(hello|sir)$       //字符串为“hi sir”捕获的结果:$1=hi$2=sir

//这些被捕获的数据,在后面就可以当变量一样使用了

6.20 if

语法:if (condition) {...}

应用场景:

  • server段
  • location段

常见的condition

  • 变量名(变量值为空串,或者以“0”开始,则为false,其它的均为true)
  • 以变量为操作数构成的比较表达式(可使用=,!=类似的比较操作符进行测试)
  • 正则表达式的模式匹配操作
    • ~:区分大小写的模式匹配检查
    • ~*:不区分大小写的模式匹配检查
    • !和!*:对上面两种测试取反
  • 测试指定路径为文件的可能性(-f,!-f)
  • 测试指定路径为目录的可能性(-d,!-d)
  • 测试文件的存在性(-e,!-e)
  • 检查文件是否有执行权限(-x,!-x)

6.20.1 基于浏览器实现分离案例

if ($http_user_agent ~ Firefox) {
  rewrite ^(.*)$ /firefox/$1 break;
}

if ($http_user_agent ~ MSIE) {
  rewrite ^(.*)$ /msie/$1 break;
}

if ($http_user_agent ~ Chrome) {
  rewrite ^(.*)$ /chrome/$1 break;
}

6.20.2 防盗链案例

location ~* \.(jpg|gif|jpeg|png)$ {
  valid_referers none blocked www.idfsoft.com;
  if ($invalid_referer) {
    rewrite ^/ http://www.idfsoft.com/403.html;
  }
}

6.21 反向代理与负载均衡

静态资源:可以理解为前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面,如果想修改内容则必须修改页面,但是访问效率相当高。
动态资源:需要程序处理或者从数据库中读数据,能够根据不同的条件在页面显示不同的数据,内容更新不需要修改页面但是访问速度不及静态页面。

nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。

nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不需要从后台服务器获取了。

但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFSMFS分布式共享存储。

Http Proxy`模块,功能很多,最常用的是`proxy_pass`和`proxy_cache

如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清除指定的URL缓存。这个集成需要在安装nginx的时候去做,如:
./configure --add-module=../ngx_cache_purge-1.0 ......

nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内

upstream段内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:

upstream idfsoft.com {
  ip_hash;
  server 127.0.0.1:9080 weight=5;
  server 127.0.0.1:8080 weight=5;
  server 127.0.0.1:1111;
}

注意:这个方法本质还是轮询,而且由于客户端的ip可能是不断变化的,比如动态ip,代理,等,因此ip_hash并不能完全保证同一个客户端总是由同一个服务器来处理。

定义好upstream后,需要在server段内添加如下内容:

server {
  location / {
    proxy_pass http://idfsoft.com;
  }
}

6.22 配置反向代理与负载均衡

环境说明

主机名 IP 服务
nginx 192.168.129.3 nginx
agent 192.168.129.33 nginx
httpd 192.168.129.133 httpd

注:nginx服务都是源码安装 、httpd为yum安装
准备工作
此文章有详细步骤:https://blog.csdn.net
每台主机开启服务,并关闭防火墙

修改配置

[root@agent ~]# vim /usr/local/nginx/conf/nginx.conf
......

    #gzip  on;

    upstream webservers {                        #配置负载均衡
        server 192.168.129.3;
        server 192.168.129.133;
    }
    

    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {                       #配置反向代理
            proxy_pass http://webservers;
        }

        #error_page  404              /404.html;

......

[root@agent ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@agent ~]# nginx -s reload

使用agent主机IP地址访问,并刷新测试
nginx_第43张图片
nginx_第44张图片

6.23 动静分离

环境说明

主机名 IP 服务
lnmp 192.168.129.135 lnmp架构
agent 192.168.129.33 nginx
httpd 192.168.153.139 httpd

准备工作
此文章有详细步骤:https://blog.csdn.net

开启服务

//lnmp主机
[root@lnmp ~]# nginx
[root@lnmp ~]# systemctl start php-fpm.service 
[root@lnmp ~]# systemctl start mysqld.service 
[root@lnmp ~]# ss -anlt
State        Recv-Q       Send-Q             Local Address:Port               Peer Address:Port       
LISTEN       0            128                    127.0.0.1:9000                    0.0.0.0:*          
LISTEN       0            128                      0.0.0.0:80                      0.0.0.0:*          
LISTEN       0            128                      0.0.0.0:22                      0.0.0.0:*          
LISTEN       0            80                             *:3306                          *:*          
LISTEN       0            128                         [::]:22                         [::]:*          

//httpd主机
[root@httpd ~]# ss -anlt
State        Recv-Q       Send-Q             Local Address:Port               Peer Address:Port                       
LISTEN       0            128                      0.0.0.0:22                      0.0.0.0:*                         
LISTEN       0            128                            *:80                            *:*          
LISTEN       0            128                         [::]:22                         [::]:*          

//agent主机
[root@agent ~]# nginx
nginx: [emerg] still could not bind()
[root@agent ~]# ss -anlt
State      Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN     0      128                     *:80                                  *:*                  
LISTEN     0      128                     *:22                                  *:*                  
LISTEN     0      100             127.0.0.1:25                                  *:*                  
LISTEN     0      128                    :::22                                 :::*                  
LISTEN     0      100                   ::1:25                                 :::* 

修改agent主机配置文件

[root@agent ~]# vim /usr/local/nginx/conf/nginx.conf
......
    #gzip  on;
    upstream static {                   
        server 192.168.129.33;			#httpd主机的ip
    }
   
    upstream dynamic {             
        server 192.168.129.135;         #lnmp主机的ip
    }

    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://static;       			#访问静态资源会自动跳转到进行访问
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        
        location ~ \.php$ {
            proxy_pass   http://dynamic;               #访问动态资源会自动跳转到进行访问
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
......

[root@agent ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@agent ~]# 
[root@agent ~]# nginx -s reload

使用agent主机IP地址访问测试

  • 访问静态资源
    nginx_第45张图片

  • 访问动态资源
    nginx_第46张图片

你可能感兴趣的:(Linux,nginx)