
万字总结,体系化带你全⾯认识 Nginx !
公众号关注“杰哥的IT之旅”,
选择“星标”,重磅⼲货,第⼀时间送达!
Nginx 概述
Nginx 是开源、⾼性能、⾼可靠的 Web 和反向代理服务器,⽽且⽀持热部署,⼏乎可以做
到 7 * 24 ⼩时不间断运⾏,即使运⾏⼏个⽉也不需要重新启动,还能在不间断服务的情况下
对软件版本进⾏热更新。性能是 Nginx 最重要的考量,其占⽤内存少、并发能⼒强、能⽀
持⾼达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使⽤也⽐较
简单。
Nginx 特点
⾼并发、⾼性能;
模块化架构使得它的扩展性⾮常好;
异步⾮阻塞的事件驱动模型这点和 Node.js 相似;
相对于其它服务器来说它可以连续⼏个⽉甚⾄更⻓⽽不需要重启服务器使得它具有⾼可靠
性;
热部署、平滑升级;
完全开源,⽣态繁荣;
Nginx 作⽤
Nginx 的最重要的⼏个使⽤场景:
1. 静态资源服务,通过本地⽂件系统提供服务;
2. 反向代理服务,延伸出包括缓存、负载均衡等;
3. API 服务, OpenResty ;
对于前端来说 Node.js 并不陌⽣, Nginx 和 Node.js 的很多理念类似, HTTP 服务
器、事件驱动、异步⾮阻塞等,且 Nginx 的⼤部分功能使⽤ Node.js 也可以实现,但 Ng
inx 和 Node.js 并不冲突,都有⾃⼰擅⻓的领域。 Nginx 擅⻓于底层服务器端资源的处
理(静态资源处理转发、反向代理,负载均衡等), Node.js 更擅⻓上层具体业务逻辑的
处理,两者可以完美组合。
⽤⼀张图表示:
Nginx 安装
本⽂演示的是 Linux centOS 7.x 的操作系统上安装 Nginx ,⾄于在其它操作系统上进
⾏安装可以⽹上⾃⾏搜索,都⾮常简单的。
使⽤ yum 安装 Nginx :
安装完成后,通过 rpm \-ql nginx 命令查看 Nginx 的安装信息:
主要关注的⽂件夹有两个:
1. /etc/nginx/conf.d/ 是⼦配置项存放处, /etc/nginx/nginx.conf 主配置⽂件会
默认把这个⽂件夹中所有⼦配置项都引⼊;
2. /usr/share/nginx/html/ 静态⽂件都放在这个⽂件夹,也可以根据你⾃⼰的习惯放在
其他地⽅;
Nginx 常⽤命令
systemctl 系统命令:
Nginx 应⽤程序命令:
Nginx 核⼼配置
配置⽂件结构
Nginx 的典型配置示例:
main 全局配置,对全局⽣效;
events 配置影响 Nginx 服务器与⽤户的⽹络连接;
http 配置代理,缓存,⽇志定义等绝⼤多数功能和第三⽅模块的配置;
server 配置虚拟主机的相关参数,⼀个 http 块中可以有多个 server 块;
location ⽤于配置匹配的 uri ;
upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;
⽤⼀张图清晰的展示它的层级结构:
配置⽂件 main 段核⼼参数
user
指定运⾏ Nginx 的 woker ⼦进程的属主和属组,其中组可以不指定。
pid
指定运⾏ Nginx master 主进程的 pid ⽂件存放路径。
worker_rlimit_nofile_number
指定 worker ⼦进程可以打开的最⼤⽂件句柄数。
worker_rlimit_core
指定 worker ⼦进程异常终⽌后的 core ⽂件,⽤于记录分析问题。
worker_processes_number
指定 Nginx 启动的 worker ⼦进程数量。
worker_cpu_affinity
将每个 worker ⼦进程与我们的 cpu 物理核⼼绑定。
将每个 worker ⼦进程与特定 CPU 物理核⼼绑定,优势在于,避免同⼀个 worker ⼦进
程在不同的 CPU 核⼼上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。
worker_priority
指定 worker ⼦进程的 nice 值,以调整运⾏ Nginx 的优先级,通常设定为负值,以优
先调⽤ Nginx 。
Linux 默认进程的优先级值是120,值越⼩越优先; nice 定范围为 -20 到 +19 。
[备注] 应⽤的默认优先级值是120加上 nice 值等于它最终的值,这个值越⼩,优先级越
⾼。
worker_shutdown_timeout
指定 worker ⼦进程优雅退出时的超时时间。
timer_resolution
worker ⼦进程内部使⽤的计时器精度,调整时间间隔越⼤,系统调⽤越少,有利于性能提
升;反之,系统调⽤越多,性能下降。
在 Linux 系统中,⽤户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会
有开销,因此这个间隔越⼤开销就越⼩。
daemon
指定 Nginx 的运⾏⽅式,前台还是后台,前台⽤于调试,后台⽤于⽣产。
配置⽂件 events 段核⼼参数
use
Nginx 使⽤何种事件驱动模型。
worker_connections
worker ⼦进程能够处理的最⼤并发连接数。
accept_mutex
是否打开负载均衡互斥锁。
server_name 指令
指定虚拟主机域名。
域名匹配的四种写法:
精确匹配: server_name www.nginx.com ;
左侧通配: server_name *.nginx.com ;
右侧统配: server_name www.nginx.* ;
正则匹配: server_name ~^www\.nginx\.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
server_name 配置实例:
1、配置本地 DNS 解析 vim /etc/hosts ( macOS 系统)
[注意] 这⾥使⽤的是虚拟域名进⾏测试,因此需要配置本地 DNS 解析,如果使⽤阿⾥云上购
买的域名,则需要在阿⾥云上设置好域名解析。
2、配置阿⾥云 Nginx , vim /etc/nginx/nginx.conf
3、访问分析
当访问 www.nginx-test.com 时,都可以被匹配上,因此选择优先级最⾼的“完全匹
配”;
当访问 mail.nginx-test.com 时,会进⾏“左匹配”;
当访问 www.nginx-test.org 时,会进⾏“右匹配”;
当访问 doc.nginx-test.com 时,会进⾏“左匹配”;
当访问 www.nginx-test.cn 时,会进⾏“右匹配”;
当访问 fe.nginx-test.club 时,会进⾏“正则匹配”;
root
指定静态资源⽬录位置,它可以写在 http 、 server 、 location 等配置中。
[注意] root 会将定义路径与 URI 叠加, alias 则只取定义路径。
alias
它也是指定静态资源⽬录位置,它只能写在 location 中。
[注意] 使⽤ alias 末尾⼀定要添加 / ,并且它只能位于 location 中。
location
配置路径。
匹配规则:
= 精确匹配;
~ 正则匹配,区分⼤⼩写;
~* 正则匹配,不区分⼤⼩写;
^~ 匹配到即停⽌搜索;
匹配优先级: = > ^~ > ~ > ~* > 不带任何字符。
实例:
location 中的反斜线
不带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test ⽬录,如
果有则找 test ⽬录下的 index.html ;如果没有 test ⽬录, nginx 则会找是否
有 test ⽂件。
带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test ⽬录,如果
有则找 test ⽬录下的 index.html ,如果没有它也不会去找是否存在 test ⽂件。
return
停⽌处理请求,直接返回响应码或重定向到其他 URL ;执⾏ return 指令
后, location 中后续指令将不会被执⾏。
# Nginx配置⽂件
/etc/nginx/nginx.conf
# nginx 主配置⽂件
/etc/nginx/nginx.conf.default
# 可执⾏程序⽂件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx库⽂件
/usr/lib/systemd/system/nginx.service
# ⽤于配置系统守护进程
/usr/lib64/nginx/modules
# Nginx模块⽬录
# 帮助⽂档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 静态资源⽬录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx⽇志⽂件
/var/log/nginx
# 开机配置
systemctl enable nginx
# 开机⾃动启动
systemctl disable nginx
# 关闭开机⾃动启动
# 启动Nginx
systemctl start nginx
# 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认⻚⾯
# 停⽌Nginx
systemctl stop nginx
# 重启Nginx
systemctl restart nginx
# 重新加载Nginx
systemctl reload nginx
# 查看 Nginx 运⾏状态
systemctl status nginx
# 查看Nginx进程
ps -ef | grep nginx
# 杀死Nginx进程
kill -9 pid
# 根据上⾯查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程
nginx -s reload
# 向主进程发送信号,重新加载配置⽂件,热重启
nginx -s reopen
# 重启 Nginx
nginx -s stop
# 快速关闭
nginx -s quit
# 等待⼯作进程处理完成后关闭
nginx -T
# 查看当前 Nginx 最终的配置
nginx -t
# 检查配置是否有问题
# main段配置信息
user nginx;
# 运⾏⽤户,默认即是nginx,可以不进⾏设置
worker_processes auto;
# Nginx 进程数,⼀般设置为和 CPU 核数⼀样
error_log /var/log/nginx/error.log warn;
# Nginx 的错误⽇志存放⽬录
pid /var/run/nginx.pid;
# Nginx 服务启动时的 pid 存放位置
# events段配置信息
events {
use epoll;
# 使⽤epoll的I/O模型(如果你不知道Nginx该使⽤哪种轮询⽅法,会⾃动选择⼀个最适合你操作系统的)
worker_connections 1024;
# 每个进程允许最⼤并发数
}
# http段配置信息
# 配置使⽤最频繁的部分,代理、缓存、⽇志定义等绝⼤多数功能和第三⽅模块的配置都在这⾥设置
http {
# 设置⽇志模式
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 /var/log/nginx/access.log main;
# Nginx访问⽇志存放位置
sendfile on;
# 开启⾼效传输模式
tcp_nopush on;
# 减少⽹络报⽂段的数量
tcp_nodelay on;
keepalive_timeout 65;
# 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types;
# ⽂件扩展名与类型映射表
default_type application/octet-stream;
# 默认⽂件类型
include /etc/nginx/conf.d/*.conf;
# 加载⼦配置项
# server段配置信息
server {
listen 80;
# 配置监听的端⼝
server_name localhost;
# 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html;
# ⽹站根⽬录
index index.html index.htm;
# 默认⾸⻚⽂件
deny 172.168.22.11;
# 禁⽌访问的ip地址,可以为all
allow 172.168.33.44;
# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html;
# 默认50x对应的访问⻚⾯
error_page 400 404 error.html;
# 同上
}
}
user USERNAME [GROUP]
user nginx lion;
# ⽤户是nginx;组是lion
pid /opt/nginx/logs/nginx.pid
# master主进程的的pid存放在nginx.pid的⽂件
worker_rlimit_nofile 20480;
# 可以理解成每个worker⼦进程的最⼤连接数量。
worker_rlimit_core 50M;
# 存放⼤⼩限制
working_directory /opt/nginx/tmp;
# 存放⽬录
worker_processes 4;
# 指定具体⼦进程数量
worker_processes auto;
# 与当前cpu物理核⼼数⼀致
worker_cpu_affinity 0001 0010 0100 1000;
# 4个物理核⼼,4个worker⼦进程
worker_priority -10;
# 120-10=110,110就是最终的优先级
worker_shutdown_timeout 5s;
daemon off;
# 默认是on,后台运⾏模式
use method;
# 不推荐配置它,让nginx⾃⼰选择
method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections 1024
# 每个⼦进程的最⼤连接数为1024
accept_mutex on
# 默认是off关闭的,这⾥推荐打开
server_name name1 name2 name3
# 示例:
server_name www.nginx.com;
# 添加如下内容,其中 121.42.11.34 是阿⾥云服务器IP地址
121.42.11.34 www.nginx-test.com
121.42.11.34 mail.nginx-test.com
121.42.11.34 www.nginx-test.org
121.42.11.34 doc.nginx-test.com
121.42.11.34 www.nginx-test.cn
121.42.11.34 fe.nginx-test.club
# 这⾥只列举了http端中的sever端配置
# 左匹配
server {
listen 80;
server_name *.nginx-test.com;
root /usr/share/nginx/html/nginx-test/left-match/;
location / {
index index.html;
}
}
# 正则匹配
server {
listen 80;
server_name ~^.*\.nginx-test\..*$;
root /usr/share/nginx/html/nginx-test/reg-match/;
location / {
index index.html;
}
}
# 右匹配
server {
listen 80;
server_name www.nginx-test.*;
root /usr/share/nginx/html/nginx-test/right-match/;
location / {
index index.html;
}
}
# 完全匹配
server {
listen 80;
server_name www.nginx-test.com;
root /usr/share/nginx/html/nginx-test/all-match/;
location / {
index index.html;
}
}
root path
例如:
location /image {
root /opt/nginx/static;
}
当⽤户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
location /image {
alias /opt/nginx/static/image/;
}
当⽤户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
location [ = | ~ | ~* | ^~ ] uri {
...
}
server {
listen 80;
server_name www.nginx-test.com;
# 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html
location = /match_all/ {
root /usr/share/nginx/html
index index.html
}
# 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
location ~ \.(jpeg|jpg|png|svg)$ {
root /usr/share/nginx/images;
}
# 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html
location ^~ /bbs/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
location /test {
...
}
location /test/ {
...
}
return code [text];
return code URL;
return URL;
微信扫⼀扫
关注该公众号
点击关注→ 昨天杰哥的IT之旅