我是靠谱客的博主 甜美小白菜,最近开发中收集的这篇文章主要介绍Nginx常见语法梳理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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等应用层信息的负载均衡。

  • 七层负载
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rg3vVcub-1630572338304)(nginx.assets/image-20210902122702767.png)]

  • 四层负载
    在这里插入图片描述

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常见语法梳理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部