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

IIS:微软所提供的Web服务器,因其所在os的劣势,不太收到欢迎;
Tomcat:天生的重量级对高并发及静态文件处理能力较弱,并发量在200左右;
Apache:很长一段时间内是主流的http服务器,但是因为年代过于久远,对高并发处理能力并不好;
Lighttpd:通nginx一样都是高性能高并发的轻量级服务器,在欧洲比较流行,国内nginx更流行;
Nginx:是一款高性能的web服务器,并发量官方给出的数值是单台服务器可支持50000的并发;
1.3 Nginx的优点:
- 速度高,并发高:基于多进程及
I/O多路复用的epoll模型,可以达到单台50000并发; - 配置简单,扩展性强:设计上极具
扩展性,有很多功能模块,可自定义模块; - 高可靠性:分为
master进程与worker进程,worker进程损坏,master进程可以从新拉起; - 热部署:Nginx可以在
不停机的情况下,升级、更新配置及更换日志文件; BSD许可证:如下图,所以nginx有些优秀的分支如OpenRestry[Nginx+lua]及Tengine[taobao];

1.4 功能与特性
Nginx提供基本功能服务可以分为三大类,基本HTTP服务、高级HTTP服务及邮件服务;
基本HTTP服务
- 处理
静态文件,处理索引文件并支持自动索引; - 提供方向代理,并提供
缓存加上反向代替,提供容错机制; - 提供对
FastCGI,memcached等服务的缓存机制,同时完成负载均衡和容错; - 使用Nginx的模块话特性提供
过滤功能; - 支持HTTP下的
SSL协议; - 支持基于加权和依赖的优先权HTTP/2;
高级HTTP服务
- 支持基于
名字和IP的虚拟主机设置; - 支持HTTP1.0中的
keep-alive模式和管线Piplined模式链接; 自定义访问日志格式、带缓存的日志写操作及快速的日志轮转;- 提供
3xx-5xx的错误页面重定向; - 支持重写
Rewrite的模块扩展; - 支持重新加载配置及在线升级时
无需中断正在处理的请求; - 支持
网络监控; - 支持
FLV及MP4流媒体传输;
邮件服务
- 支持
IMPA/POP3代理服务功能; - 支持内部
SMTP代理服务;
1.5 常用的功能
Nginx的功能非常丰富,但常用模块如下:
静态资源的部署;Rewrite重写,需要用到正则;反向代理功能;负载均衡功能;web缓存功能;高可用的环境部署;- 其他
1.6 重点掌握的内容
Nginx的二进制文件:通过它进行启动加载重启等操作;Nginx.conf配置文件:Nginx的所有配置均需要写到这里;error.log错误日志:调试时使用;access.log访问日志:用于记录所有的访问记录;
二. Nginx环境准备
2.1 版本源码的获取

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对比:
简单编译安装:

yum安装:

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

2.2.5 configure所带选项
主要是在编译的时候带选项即配置configure arguments,大约有100多个参数,可分为三类和补充:
- 以
path结尾的,为设定nginx安装时的一些文件的存放路径; - 以
--with开头的,为nginx的模块,可用于添加第三方模块的支持; - 以
--without排除某些模块; - 补充:
--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
查看效果

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进程的信息即是信号。

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,在使用这个信号时:
- 新建一个
master进程及其附属的worker进程,master进程的pid存放在logs/nginx.pid中; - 原
master进程信息会存放在logs/nginx.pid.oldbin中; - 当我们确认升级没有问题时,可以使用
QUIT信号及nginx.pid.oldbin来关闭老的master及worker进程;
2.5.2 命令行控制

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资源,找到返回;
}
}
}

浙公网安备 33010602011771号