概述
1、nginx 简介
nginx可以在高并发量业务场景做web服务器,也可以在网络模型中的四层或七层作为负载均衡器使用。nginx与apache核心区别在于:apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级单位)可以对应一个进程。
1.1 nginx 负载均衡
目前的很多设备已经支持 OSI 模型中的二层、三层、四层和七层的负载均衡:
- 二层,基于网络接口的负载均衡(MAC地址)
- 三层,基于服务器 IP 地址的负载均衡(IP地址)
- 四层,基于 TCP/UDP 端口的负载均衡,(nginxàstream模块)
- 七层,应用层负载均衡,如 URL、HTTP 表头等(nginxàupstream模块)
所谓四层就是基于IP+端口的负载均衡,通过虚拟IP+端口接收请求,然后再分配到真实的服务器;七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器七层就是基于URL等应用层信息的负载均衡。
-
七层负载
-
四层负载
2、nginx 原理
2.1 nginx 高性能、高并发
- nginx 采用多进程+异步非阻塞方式(IO多路复用Epoll)
- 请求的完整过程:建立连接–>读取请求–>解析请求–>处理请求–>响应请求
- 请求的完整过程对应到底层就是:读写 socket 事件
2.2 http建立连接和请求处理过程
- nginx启动时,Master进程加载配置文件
- master进程,初始化监听的 socket
- master 进程,fork 出多个 worker 进程
- worker 进程,竞争新的连接,获胜方通过三次握手,建立 socket 连接,并处理请求
2.3 Nginx 的多进程结构:
多进程中的 Nginx 进程架构如下图所示,会有一个父进程(Master Process),它会有很多子进程(Child Processes)。
-
Master Process 用来管理子进程的,其本身并不真正处理用户请求。
-
- 某个子进程 down 掉的话,它会向 Master 进程发送一条消息,表明自己不可用了,此时 Master 进程会去新起一个子进程。
- 某个配置文件被修改了 Master 进程会去通知 work 进程获取新的配置信息,这也就是我们所说的热部署。
-
子进程间是通过共享内存的方式进行通信的。
2.4 配置文件 reload 重载原理
- 向 master 进程发送 HUP 信号(reload 命令);
- master 进程检查配置语法是否正确;
- master 进程打开监听端口;
- master 进程使用新的配置文件启动新的 worker 子进程;
- master 进程向老的 worker 子进程发送 QUIT 信号;
- 老的 worker 进程关闭监听句柄,处理完当前连接后关闭进程;
- 整个过程 Nginx 始终处于平稳运行中,实现了平滑升级,用户无感知;
2.5 Nginx 模块化管理机制
Nginx 的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。Nginx 的模块是互相独立的,低耦合高内聚。
3、nginx 配置
3.1 nginx配置文件
nginx配置文件大致分三部分:main全局、events块、http块。
- main 全局块:全局配置,对全局生效。
- 比如:worker_processes 1; 设置可以支持的并发处理量数。
- events块:配置影响nginx服务器与用户的网络连接。
- worker_connections 1024; 支持的最大连接数。
- http块: 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
- server 块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块。
- location块:配置请求路由,以及各种页面的处理情况。
3.1.1 main 全局配置参数
- user
指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
user USERNAME [GROUP]
user nginx nginx; # 用户是 nginx;组是 nginx
- pid
指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid # master主进程的的 pid 存放在 nginx.pid 的文件
- worker_rlimit_nofile_number
指定 worker 子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; # 可以理解成每个 worker 子进程的最大连接数量。
- worker_rlimit_core
指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; # 存放大小限制
working_directory /opt/nginx/tmp; # 存放目录
- worker_processes_number
指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; # 指定具体子进程数量
worker_processes auto; # 与当前 CPU 物理核心数一致
- worker_cpu_affinity
将每个 worker 子进程与我们的 CPU 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个 worker 子进程
3.1.2 events
- use
Nginx 使用何种事件驱动模型。
use method; # 不推荐配置它,让 Nginx 自己选择
method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
- worker_connections
worker 子进程能够处理的最大并发连接数。
worker_connections 1024 # 每个子进程的最大连接数为 1024
- accept_mutex
是否打开负载均衡互斥锁。
accept_mutex on # 默认是 off 关闭的,这里推荐打开
- server_name 指令
指定虚拟主机域名。
server_name name1 name2 name3
# 示例:
server_name www.nginx.com;
域名匹配的四种写法:
- 精确匹配:server_name www.nginx.com ;
- 左侧通配:server_name *.nginx.com ;
- 右侧统配:server_name www.nginx.* ;
- 正则匹配:server_name ~^www.nginx.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
3.1.3 http块
- incloud
include /usr/local/lnmp/nginx/conf.d/*.conf; # 加载子配置项
- access_log
access_log /var/log/nginx/access.log access; # Nginx 访问日志存放位置
error_log /var/log/nginx/error.log error;
- location
配置路径
location [ = | ~ | ~* | ^~] uri {
...
}
匹配规则:
-
= 精确匹配
-
~ 正则匹配,区分大小写
-
~ * 正则匹配,不区分大小写
-
^~ 匹配到即停止搜索
匹配的优先级: = > ^~ > ~ > ~* > ~ > 不带任何字符
-
location 中的反斜线
location /test {
...
}
location /test/ {
...
}
- 不带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html;如果没有 test 目录,Nginx 则会找是否有 test 文件。
- 带 / 当访问 www.nginx-test.com/test 时,Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html,如果没有它也不会去找是否存在 test 文件。
# /etc/nginx/conf.d/proxy.conf
upstream back_end {
server 192.168.137.11:8081 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
keepalive 32;
keepalive_requests 80;
keepalive_timeout 20s;
}
server {
listen 80;
server_name cmdb.oa.com;
location /api/ {
proxy_pass http://back_end/;
}
}
4、 nginx 实战
4.1 脚本安装
useradd -s /sbin/nologin -M nginx
[ ! -e /usr/local/lnmp ] && mkdir /usr/local/lnmp
yum install -y gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
wget http://nginx.org/download/nginx-1.15.2.tar.gz
tar zxf nginx-1.15.2.tar.gz
cd nginx-1.15.2
./configure --prefix=/usr/local/lnmp/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
参考配置:
# 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 access; # Nginx 访问日志存放位置
error_log /var/log/nginx/error.log error;
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /usr/local/lnmp/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /usr/local/lnmp/nginx/conf.d/*.conf; # 加载子配置项
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /data/wbdocs/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; # 同上
}
}
- /usr/local/lnmp/nginx/conf.d/ 子配置项存放处
- /usr/local/lnmp/nginx/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入
- /data/wbdocs/nginx/html 网站静态文件
最后
以上就是甜美小白菜为你收集整理的Nginx常见语法梳理的全部内容,希望文章能够帮你解决Nginx常见语法梳理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复