Nginx基础篇

一. Nginx的简介

1.1 出现的背景

Nginx是一个具有高性能的HTTP反向代理WEB服务器,同时也是一个POP3/SMTP/IMAP代理服务器;由伊戈尔-赛索耶夫使用C语言编写的,第一个版本是2004年10月4号发布的0.1.0版本,开源为Nginx的发展提供了良好的保障;

1.2 服务器对比

Netcraft会在官网上公布web server的调研数据,从nginx官网中可以看到,截止2021占比达39%

image-20210831221029086

IIS:微软所提供的Web服务器,因其所在os的劣势,不太收到欢迎;

Tomcat:天生的重量级对高并发及静态文件处理能力较弱,并发量在200左右;

Apache:很长一段时间内是主流的http服务器,但是因为年代过于久远,对高并发处理能力并不好;

Lighttpd:通nginx一样都是高性能高并发的轻量级服务器,在欧洲比较流行,国内nginx更流行;

Nginx:是一款高性能的web服务器,并发量官方给出的数值是单台服务器可支持50000的并发;

1.3 Nginx的优点

  1. 速度高,并发高:基于多进程及I/O多路复用epoll模型,可以达到单台50000并发;
  2. 配置简单,扩展性强:设计上极具扩展性,有很多功能模块,可自定义模块
  3. 高可靠性:分为master进程与worker进程,worker进程损坏,master进程可以从新拉起
  4. 热部署:Nginx可以在不停机的情况下,升级更新配置更换日志文件
  5. BSD许可证:如下图,所以nginx有些优秀的分支如OpenRestry[Nginx+lua]Tengine[taobao];

image-20210831222921482

1.4 功能与特性

Nginx提供基本功能服务可以分为三大类,基本HTTP服务高级HTTP服务邮件服务

基本HTTP服务

  1. 处理静态文件,处理索引文件并支持自动索引
  2. 提供方向代理,并提供缓存加上反向代替,提供容错机制
  3. 提供对FastCGImemcached等服务的缓存机制,同时完成负载均衡和容错;
  4. 使用Nginx的模块话特性提供过滤功能
  5. 支持HTTP下的SSL协议;
  6. 支持基于加权和依赖的优先权HTTP/2;

高级HTTP服务

  1. 支持基于名字和IP虚拟主机设置;
  2. 支持HTTP1.0中的keep-alive模式和管线Piplined模式链接;
  3. 自定义访问日志格式、带缓存的日志写操作及快速的日志轮转;
  4. 提供3xx-5xx的错误页面重定向;
  5. 支持重写Rewrite的模块扩展;
  6. 支持重新加载配置及在线升级时无需中断正在处理的请求;
  7. 支持网络监控
  8. 支持FLVMP4流媒体传输;

邮件服务

  1. 支持IMPA/POP3代理服务功能;
  2. 支持内部SMTP代理服务;

1.5 常用的功能

Nginx的功能非常丰富,但常用模块如下:

  1. 静态资源的部署;
  2. Rewrite重写,需要用到正则;
  3. 反向代理功能;
  4. 负载均衡功能;
  5. web缓存功能;
  6. 高可用的环境部署;
  7. 其他

1.6 重点掌握的内容

  1. Nginx的二进制文件:通过它进行启动加载重启等操作;
  2. Nginx.conf配置文件:Nginx的所有配置均需要写到这里;
  3. error.log错误日志:调试时使用;
  4. access.log访问日志:用于记录所有的访问记录;

二. Nginx环境准备

2.1 版本源码的获取

image-20210901102851372

2.2 编译安装

2.2.1 编译安装前准备

GCC编译器:一个开源的编译器集合,用于处理各种各样的语言包含C语言的编译;

yum install -y gcc
gcc --version # 查看gcc是否安装成功

PCRE(perl Compatible Regular Expressiion):在nginx的Rewrite模块和http模块使用PCRE正则

yum install -y pcre pcre-devel
rpm -qa pcre pcre-devel # 查看pcre是否安装成功

zlib:提供给开发人员的压缩算法,nginx各模块使用gzip对注入静态资源进行压缩

yum install -y zlib zlib-devel
rpm -qa zlib zlib-devel # 查看zlib是否安装成功

OpenSSL:开源的软件库包,实现了SSL协议,nginx用此保护HTTP的流量;

yum install -y openssl openssl-devel
rpm -qa openssl openssl-devel # 查看openssl是否安装成功

2.2.2 简单编译安装

下载对应版本的nginx的源码

wget https://nginx.org/download/nginx-1.20.1.tar.gz

建立文件夹对资源进行包管理

mkdir -p nginx/core
mv nginx-1.20.1.tar.gz nginx/core

解压缩

tar -zxvf nginx-1.20.1.tar.gz

进入资源文件中,运行configure脚本

./configure

编译

make

安装

make install

2.2.3 编译与yum安装对比

简单编译安装中未对nginx做一些附件组件的安装,如使用简单编译安装与yum安装的nginx -V对比:

简单编译安装:

image-20210901115439294

yum安装:

image-20210901115632588

但是yum安装时,所添加的参数/组件太多了,所以可以通过复杂编译安装定制化参数/组件。

2.2.4 编译安装目录解析

image-20210901141549567

2.2.5 configure所带选项

主要是在编译的时候带选项即配置configure arguments,大约有100多个参数,可分为三类和补充:

  1. path结尾的,为设定nginx安装时的一些文件的存放路径
  2. --with开头的,为nginx的模块,可用于添加第三方模块的支持
  3. --without排除某些模块;
  4. 补充:--user=USER --group=GROUP设置nginx运行时使用的用户及组信息 --help帮助;

path常用的选项

参数 说明 默认值
--prefix=PATH nginx安装目录 /usr/local/nginx
--sbin-path=PATH 可执行的nginx文件路径 <prefix>/sbin/nginx
--modules-path=PATH 动态模块安装路径 <prefix>/modules
--conf-path=PATH 配置文件路径 <prefix>/conf/nginx.conf
--error-log-path=PATH 错误日志文件路径 <prefix>/logs/error.log
--http-log-path=PATH 访问日志文件路径 <prefix>/logs/access.log
--pid-path=PATH 存nginx运行时的pid的文件 <prefix>/logs/nginx.pid
--lock-path=PATH 存nginx锁文件的存放路径 <prefix>/logs/nginx.lock

2.2.6 卸载简单编译

关闭nginx的进程

./nginx -s stop

将安装的nginx删除

rm -rf /usr/local/nginx

将安装包之前编译的环境清除

make clean

2.2.7 使用选项的定制化安装

# 如下,定制了一些路径的信息
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx \
--modules-path=/usr/local/nginx/modules --conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--lock-path=/usr/local/nginx/logs/nginx.lock

编译并安装

make & make install

查看效果

image-20210901172616405

2.3 在Centos上yum安装Nginx

可以在官方文档中获取最新的yum安装的指导及说明;

安装yum-utils

sudo yum install yum-utils -y

配置yum

vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

默认使用的稳定版(一般使用这个),如果需要安装主线版-最新版,可以执行下面一步:

sudo yum-config-manager --enable nginx-mainline

使用yum安装nginx

sudo yum install nginx -y

2.4 Nginx的目录机构分析

/usr/local/nginx/
├── client_body_temp
├── conf # 存放nginx配置相关文件,可分为几类:
# 类别1:CGI(Common Gateway Interface)通用网关接口,用于做HTTP与Web程序间数据的转换;
# 1. CGI是一种标准规范,但是CGI处理的效率较低,后衍生出一些优化的实现;
│   ├── fastcgi.conf
│   ├── fastcgi.conf.default # .default的文件是没有default的副本,用于损坏恢复
│   ├── fastcgi_params
│   ├── fastcgi_params.default 
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   ├── scgi_params
│   ├── scgi_params.default
# 类别2:是一些编码的规范,可以实现从一种编码转换为另一种编码
│   ├── koi-utf
│   ├── koi-win
│   ├── win-utf
# 类别3:MIME.types定义了HTTP请求HEAD中的content-type与服务器上文件后缀的对应
# 1. 比如text/html ---对应--- html htm shtml;
│   ├── mime.types
│   ├── mime.types.default
# 类别4:核心配置文件
│   ├── nginx.conf
│   └── nginx.conf.default
├── html # 存放一些静态页面
│   ├── 50x.html # 错误的静态页面
│   └── index.html # 默认的首页
├── logs  # 存放日志及pid信息
│   ├── access.log # 2xx类的访问日志
│   ├── error.log  # 4xx, 5xx的异常访问日志
│   └── nginx.pid  # nginx的master进程的进程号,用于信号量的控制
├── sbin # 存放可执行文件
│   └── nginx # 二进制可执行文件
# ?????这些后面补充,未知..
├── proxy_temp
├── fastcgi_temp
├── scgi_temp
└── uwsgi_temp

2.5 Nginx服务的启停控制

nginx有master进程与work进程,管理员通过master进程管理work进程,管理员传递给master进程的信息即是信号

image-20210901174749634

2.5.1 信号的控制

信号 作用
TERM/INT 立即关闭整个服务
QUIT '优雅'关闭整个服务,即等待在处理请求完成后关闭服务-不保留master进程
HUP 重读配置文件并启用新的work进程来使新配置项生效
USR1 重新打开日志文件,可以用来进行日志切割
USR2 平滑升级到最新版的nginx
WINCH 所有子进程不在接收处理新连接-等于给work进程发送QUIT指令-会保留master进程

调用的命令

Tips:master进程的pid可以在logs/nginx.pid来获取;

kill -信号 PID
# 发送TERM/INT信号给master进程;
kill -TERM PID
kill -INT PID

USR2信号说明

USR2信号用来平滑升级nginx,在使用这个信号时:

  1. 新建一个master进程及其附属的worker进程,master进程的pid存放在logs/nginx.pid中;
  2. master进程信息会存放在logs/nginx.pid.oldbin中;
  3. 当我们确认升级没有问题时,可以使用QUIT信号及nginx.pid.oldbin来关闭老的masterworker进程;

2.5.2 命令行控制

image-20210901184221872

2.6 Nginx服务器版本升级和新增模块

Nginx支持平滑的版本升级及模块新增,共有两种方案,分别是通过信号make命令完成;

需求:从1.20.1 降级到1.6.0

2.6.1 前期准备

需替换版本准备:

# 进入1.20.1目录
./configure
make && make install # 如果已安装了nginx,省略
./sbin/nginx # 启动nginx

替换版本准备:

# 进入1.6.0目录
./configure
make

2.6.2 通过信号完成升级

# 备份原二进制文件
mv nginx nginx.old
# copy新的二进制文件到sbin下
cp ~/nginx/core/nginx-1.2.1/objs/nginx /usr/local/nginx/sbin/
# 发送信号量USR2
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# 发送信号量QUIT
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

2.6.3 通过make完成升级

make upgrade其实也是通过信号完成升级的,只是更自动化一点;

# 备份原二进制文件
mv nginx nginx.old
# copy新的二进制文件到sbin下
cp ~/nginx/core/nginx-1.6.0/objs/nginx /usr/local/nginx/sbin/
# 进入到新版本的根目录,如恢复1.20.1版本
cd /root/nginx/core/nginx-1.20.1
make upgrade
###输出信息#####
#/usr/local/nginx/sbin/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
#kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
#sleep 1
#test -f /usr/local/nginx/logs/nginx.pid.oldbin
#kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

三. Nginx配置文件分析

3.1 Nginx的默认配置

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;
        }
    }
}

默认配置整体分为几块:

类型 形式 说明
全局块 指令名 指令值; 设置nginx服务器整体运行的配置指令;
event块 event {} 设置nginx与用户网络连接的形式,性能影响较大,需特别优化;
http块 http {} 是nginx服务器配置中的重要部分,包含代理、缓存、日志记录、第三方模块配置
其内部包含http全局块、多个server块,server内部的多个location块;
server块:Nginx配置和虚拟主机相关信息;
location块:基于server接收到的路径,来匹配location块,并在location块中完成处理;

3.2 全局块指令-初级

user指令:用于配置worker进程的守护用户和用户组;

  • 默认值:nobody

  • 语法:user user [group]

  • 也可以在编译时指定:./configure --user=username --group=groupname,配置优于编译;

  • 如在配置中指定某个用户,需要在os中新建该用户,否则报错,需要注意用户对资源的访问权限;

    useradd www
    vim nginx.conf
    # 全局块下
    user www;
    

daemon:是否以daemon的形式运行nginx,off的话会在当前shell下调用,方便调试;

  • 默认值:daemon on;
  • 语法:daemon on|off;

master_process:是否以master/worker进程类型来运行,off是直接使用master进程来处理请求;

  • 默认值:master_process on;
  • 语法:master_process on|off;

worker_processes:指定worker的进程的数量,一般配置与CPU内核数相等worker进程;

  • 默认值:worker_processes 1;
  • 语法:worker_prcesses num/auto;

pid:指定master进程的pid存储文件路径

  • 默认值:/usr/local/nginx/logs/nginx.pid
  • 语法:pid ..../**.pid;

error_log:设定异常日志的收取级别存放位置

  • 默认值:error_log logs/error.log error;
  • 语法:error_log ../**.log debug|info|notice|warn|error|crit|alert|emery;
  • 注意:error_log可以在全局、http、server、location中配置,影响范围越小越优

include:用来引进其他配置文件,使Nginx的配置层次更加清晰,配置更加灵活;

  • 默认值:无
  • 语法:include 文件的绝对/相对当前文件路径
  • 注意:include可以在任意位置调用,用于扩充当前块的配置;

3.3 events块指令-初级

accept_mutex:设置Nginx网络连接序列化,防止出现“惊群”的现象;

  • 默认值:accept_mutex on;
  • 语法:accept_mutex on|off;
  • 作用:对Nginx的多个进程接收连接序列化,按照一定逻辑一个个唤醒接收,防止多个进程被唤醒;
  • 注意:并发连接很高时,多个进程被唤醒的效率可能会更高些;

multi_accept:用来设置是否允许同时接收多个网络连接;

  • 默认值:multi_accept off;
  • 语法:multi_accept on|off;
  • 建议:multi_accpet on;

worker connections:用来配置单个worker进程最大的连接数;

  • 默认值:worker_connections 512
  • 语法:worker_connections num;
  • 建议:更改的最大连接数不能超过系统所允许的最大打开文件的句柄数量;

use:设置Nginx服务器选择哪种事件驱动来处理网络消息;

  • 默认值:根据操作系统定;

  • 语法:use select|poll|epoll|kqueue等;

  • 说明:可在编译时选择/不选择某种支持:

    --with-select_module、--without-select_module
    --with-poll_module、--without-poll_module
    

3.4 http块指令-初级

3.4.1 定义MIME-Type

Nginx基于response所带的文件后缀名在mime.types的表中查找并带上相应的Header响应request,这样浏览器就知道response所带的数据类型是什么,从而决定如何处理;

在Nginx的配置文件中,默认有两行配置:

include mine.types; # 引入conf文件夹下的文件后缀及请求头的mapping
default_type application/octet-stream; # 如果未匹配后缀名,则默认为普通文件流处理

default_type:配置Nginx响应前端请求默认MIME类型

  • 默认值:default_type text/plain:
  • 语法:default_type mime-type;
  • 说明:可在http块、server块、location块中使用;

实现-Nginx返回简单的文本字符串或者json字符串

http {
    include       mime.types;
    default_type  application/octet-stream;
    ...
    server { 
        listen       80;
        server_name  localhost;
        ...
        location /msg {  # 定义当访问的路径匹配/msg时,执行当前location块
            default_type text/html; # 设置默认的response头部为text/html
            return 200 "this is a simple msg from nginx";
        }
        location /json { # 定义当访问的路径匹配/json时,执行当前的location块
            default_type application/json; # 设置默认的response头部为application/json;
            return 200 '{"name":"Bruce", "age":"18"}';
        }
    }
}

访问https://ip/msg 和 http://ip/json会有相应的返回

3.4.2 定义服务日志

Nginx中日志的类型分为access.log-正常访问日志记录与error.log-记录nginx运行时的错误信息;

Nginx支持对服务日志的格式大小输出等进行设置,需要用到两个指令:

access_log:用来设置用户访问日志的相关属性;

  • 默认值:access_log logs/access.log combined;
  • 语法:access_log path [format [buffer=size] [flush=5s]]; 如不想启用可以设置access_log off;
  • 说明:可以在http块、server块、location块中使用;
  • 注意:error_log指定与access_log相同;

log_format:用来定义日志输出的格式,由access_log中的format来调用,不调用不生效;

  • 默认值:log_format combined "...";
  • 语法:log_format name [escape=default|json|none] string...;
  • 说明:仅可在http块中;

实现-自定义Nginx的日志格式,并将日志文件输出到msg,日志必须满32K且5s强制存盘

...
http {
    ...
    # $xxx - 是nginx内部的宏变量,有很多可以在定义日志时调用;
    log_format brucelog 'Bruce defined: $remote_addr - $request - $status - $bytes_sent';
    server {
        listen       80;
        server_name  localhost;
        location / {
      			# 访问日志的format使用brucelog, buffer设置32K,flush时间设置为5s;
            access_log logs/bruce.log brucelog buffer=32K flush=5s; 
            ...
        }
			  ...
    }
}

3.4.3 http块中其他常见指令

sendfile:是否使用Linux中的sendfile()来传输文件,该值可以大大提高Nginx处理静态资源的性能

  • 默认值:sendfile off;
  • 语法:sendfile on|off;
  • 说明:可在http块、server块、location块中使用,建议打开;

keepalive_timeout:设置TCP长连接超时时间,避免长链接过长时间空耗服务器性能;

keepalive可以避免同一客户端多次HTTP请求时,反复创建TCP链接;

  • 默认值:keepalive_timeout 75s;
  • 语法:keepalive_timeout time;
  • 说明:可在http块、server块、location块中使用,根据需要合理调整;

keepalive_request:设置一个TCP长链接可以使用的HTTP请求次数,是timeout的补充;

  • 默认值:keepalive_requests 100;
  • 语法:keepalive_requests num;
  • 说明:可在http块、server块、location块中使用,根据需要合理调整;

3.5 server&location块指令-初级

server块与location块中包含了nginx核心功能的一些设定,需要根据功能来了解,初级只包含默认配置中server&location块中的指令;

...
http {
    ...
    server {
        listen       80; # 监听的端口
        server_name  localhost; # 监听的ip,这两个组成了url访问时的host部分;
        location / { 
            root   html; # 该location块对应的目录;
            index  index.html index.htm; # 仅有/时,返回index对应的资源,多个值从前往后找到一个;
        }
        error_page   500 502 503 504  /50x.html; # 定义这些错误发生时跳转的url路径;
        location = /50x.html { 
            root   html; # 该location对应的根目录,去其中找50x.html资源,找到返回;
        }
    }
}
posted @ 2021-09-02 15:05  FcBlogs  阅读(118)  评论(0)    收藏  举报