浅谈Nginx基础概念

夙愿已清 提交于 2020-01-18 02:16:07

1️⃣ Nginx简述

2️⃣ Nginx功能介绍

🅿 1.Nginx基础特性

  • 特性:
    模块化设计,较好的扩展性
    ⾼可靠性
    ⽀持热部署:不停机更新配置⽂件,升级版本,更换⽇志⽂件
    低内存消耗:10000个keep-alive连接模式下的⾮活动连接,仅需2.5M内存
    event-driven,aio,mmap,sendfile
  • 基本功能:
    静态资源的web服务器
    http协议反向代理服务器
    pop3/imap4协议反向代理服务器
    FastCGI(LNMP),uWSGI(python)等协议
    模块化(⾮DSO),如zip,SSL模块

🅿 2.Nginx组织结构

▶ 1.web请求处理机制

  • 1、多进程⽅式:服务器每接收到⼀个客⼾端请求就有服务器的主进程⽣成⼀个⼦进程响应客⼾端,直到⽤⼾关闭连接,这样的优势是处理速度快,各⼦进程之间相互独⽴,但是如果访问过⼤会导致服务器资源耗尽⽽⽆法提供请求。
  • 2、多线程⽅式:与多进程⽅式类似,但是每收到⼀个客⼾端请求会有服务进程派⽣出⼀个线程来个客⼾⽅进⾏交互,⼀个线程的开销远远⼩于⼀个进程,因此多线程⽅式在很⼤程度减轻了web服务器对系统资源的要求,但是多线程也有⾃⼰的缺点,即当多个线程位于同⼀个进程内⼯作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,另外⼀旦主进程挂掉则所有⼦线程都不能⼯作了,IIS服务器使⽤了多线程的⽅式,需要间隔⼀段时间就重启⼀次才能稳定。

▶ 2. Nginx组织模型

Nginx是多进程组织模型,⽽且是⼀个由Master主进程和Worker⼯作进程组成。
在这里插入图片描述
主进程(master process)的功能

  • 读取Nginx 配置⽂件并验证其有效性和正确性
  • 建⽴、绑定和关闭socket连接
  • 按照配置⽣成、管理和结束⼯作进程
  • 接受外界指令,⽐如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应⽤新的配置
  • 开启⽇志⽂件,获取⽂件描述符
  • 不中断服务,实现平滑升级,升级失败进⾏回滚处理
  • 编译和处理perl脚本

⼯作进程(woker process)的功能:

  • 接受处理客⼾的请求
  • 将请求以此送⼊各个功能模块进⾏处理
  • IO调⽤,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调⽤缓存数据
  • 发送请求结果,响应客⼾的请求
  • 接收主程序指令,⽐如重启、升级和退出等
    在这里插入图片描述

▶ 3. Nginx进程间通信

  • ⼯作进程是有主进程⽣成的,主进程使⽤fork()函数,
  • 在Nginx服务器启动过程中主进程根据配置⽂件决定启动⼯作进程的数量,然后建⽴⼀张全局的⼯作表⽤于存放当前未退出的所有的⼯作进程,
  • 主进程⽣成⼯作进程后会将新⽣成的⼯作进程加⼊到⼯作进程表中,并建⽴⼀个单向的管道并将其传递给⼯作进程,
  • 该管道与普通的管道不同,它是由主进程指向⼯作进程的单项通道,包含了主进程向⼯作进程发出的指令、⼯作进程ID、⼯作进程在⼯作进程表中的索引和必要的⽂件描述符等信息
  • 主进程与外界通过信号机制进⾏通信,当接收到需要处理的信号时,它通过管道向相关的⼯作进程发送正确的指令,每个⼯作进程都有能⼒捕获管道中的可读事件
  • 当管道中有可读事件的时候,⼯作进程就会从管道中读取并解析指令,然后采取相应的执⾏动作,这样就完成了主进程与⼯作进程的交互。
    在这里插入图片描述
  • ⼯作进程之间的通信原理基本上和主进程与⼯作进程之间的通信是⼀样的,只要⼯作进程之间能够取得彼此的信息,建⽴管道即可通信,但是由于⼯作进程之间是完全隔离的,因此⼀个进程想要直到另外⼀个进程的状态信息就只能
    通过主进程来设置了。
  • 为了实现⼯作进程之间的交互,主进程在⽣成⼯作进程只之后,在⼯作进程表中进⾏遍历,将该新进程的ID以及针对该进程建⽴的管道句柄传递给⼯作进程中的其他进程,为⼯作进程之间的通信做准备,当⼯作进程1向⼯作进程2发送指令的时候,⾸先在主进程给它的其他⼯作进程⼯作信息中找到2的进程ID,然后将正确的指令写⼊指向进程2的管道,
    作进程2捕获到管道中的事件后,解析指令并进⾏相关操作,这样就完成了⼯作进程之间的通信。

🅿 3.Nginx模块说明

nginx⾼度模块化,但其模块早期不⽀持DSO机制;1.9.11版本⽀持动态装载和卸载

🌐 模块分类

  • 核⼼模块core module
  • 常用的标准模块
    • HTTP modules:
      ngx_http_core_modules                        / http核心功能模块(重要)
      ngx_http_ssl_module                          / http信道加密模块(重要)
      ngx_http_upstream_module                     / http定义服务器组模块(重要)
      ngx_http_fastcgi|uWSGI|SCGI_module           / http web api接口模块(重要)
      ngx_http_proxy_module                        / http反向代理模块(重要)
      ngx_http_gzip_module                         / http gzip压缩传输模块(次一级)
      ngx_http_log_module                          / http日志模块(次一级)
      ngx_http_referer_module                      / http防盗链模块(次一级)
      ngx_http_rewrite_module                      / http重定向模块(次一级)
      ngx_http_access_module                       / http权限控制模块
      ngx_http_auth_basic_module                   / http认证模块
      ngx_http_stub_status_module                  / http状态模块
      ngx_http_headers_module                      / http首部信息模块
      
    • Mail modules:用的少
    • Stream modules:
      ngx_stream_core_module http的伪四层负载均衡模块
    • 第三方模块
    echo-nginx-module   / 支持在配置文件中使用 echo、sleep、time 即 exec 等类似 shell 命令。
    memc-nginx-module   / 对标准http模块 ngx_http_memcached_module 的扩展,支持 set、add、delete 等命令
    lua-nginx-module    / 支持 lua 脚本语言
    

在这里插入图片描述

🅿 4.Nginx安装

▶ 1. Centos版本 yum安装

  • 配置epel源,用过epel源
[root@s1 ~]# yum install epel-release -y
[root@s1 ~]# yum install -y nginx
[root@s1 ~]# rpm -ql nginx
  • 查看版本 nginx -v
  • 查看编译模块 nginx -V

▶ 2. Ubuntu版本 apt安装

  • 更新apt源 apt update
root@ubuntu1804-31:~# apt-cache madison nginx      / 查看nginx版本列表
root@ubuntu1804-31:~# apt -y install nginx
  • 查看版本 nginx -v
  • 查看编译模块 nginx -V

▶ 3. 查看帮助

nginx -h
nginx version: nginx/1.16.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit                        / 显⽰版本和编译参数
-t : test configuration and exit                                         / 测试配置⽂件是否异常
-T : test configuration, dump it and exit                                / 测试并打印
-q : suppress non-error messages during configuration testing            / 静默模式
-s signal : send signal to a master process: stop, quit, reopen, reload  / 发送信号
-p prefix : set prefix path (default: /usr/share/nginx/)                 / 指定Nginx ⽬录
-c filename : set configuration file (default: /etc/nginx/nginx.conf)    / 配置⽂件路径
-g directives : set global directives out of configuration file          / 设置全局指令

▶ 4. Nginx编译安装

  • 配置基础编译环境
yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate
gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel nettools
iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2
libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed

gcc为GNU Compiler Collection的缩写,可以编译C和C++源代码等,它是GNU开发的C和C++以及其他很多种语⾔
的编译器(最早的时候只能编译C,后来很快进化成⼀个编译多种语⾔的集合,如Fortran、Pascal、Objective-
C、Java、Ada、 Go等。)
gcc 在编译C++源代码的阶段,只能编译 C++ 源⽂件,⽽不能⾃动和 C++ 程序使⽤的库链接(编译过程分为编
译、链接两个阶段,注意不要和可执⾏⽂件这个概念搞混,相对可执⾏⽂件来说有三个重要的概念:编译
(compile)、链接(link)、加载(load)。源程序⽂件被编译成⽬标⽂件,多个⽬标⽂件连同库被链接成⼀个最
终的可执⾏⽂件,可执⾏⽂件被加载到内存中运⾏)。因此,通常使⽤ g++ 命令来完成 C++ 程序的编译和连接,该
程序会⾃动调⽤ gcc 实现编译。
gcc-c++也能编译C源代码,只不过把会把它当成C++源代码,后缀为.c的,gcc把它当作是C程序,⽽g++当作是
c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
automake是⼀个从Makefile.am⽂件⾃动⽣成Makefile.in的⼯具。为了⽣成Makefile.in,automake还需
⽤到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是⼀款⽅便⽣成各种程
序库的⼯具。
pcre pcre-devel:在Nginx编译需要 PCRE(Perl Compatible Regular Expression),因为Nginx 的
Rewrite模块和HTTP 核⼼模块会使⽤到PCRE正则表达式语法。
zlip zlib-devel:nginx启⽤压缩功能的时候,需要此模块的⽀持。
openssl openssl-devel:开启SSL的时候需要此模块的⽀持。
  • 编译安装
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
useradd -s /sbin/nologin  -r nginx

[root@s2 nginx-1.16.1]#./configure --prefix=/apps/nginx \
--user=nginx \                         / 启动用户
--group=nginx \                        / 用户所属组
--with-http_ssl_module \               / http信道加密模块
--with-http_v2_module \
--with-http_realip_module \            / 模块用于将客户端地址和可选端口更改为在指定的标头字段中发送的客户端地址和可选端口。
--with-http_stub_status_module \      / http状态模块
--with-http_gzip_static_module \      / http gzip压缩传输模块
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

make && make install

chown -R nginx.nginx /apps/nginx

/apps/nginx/sbin/nginx     / 启动nginx

ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx    /软链接

制作启动脚本加入systemd
vim /lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid               / 必须跟配置文件里面PID路径一模一样
ExecStartPre=/apps/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/apps/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/apps/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=/bin/kill -s TERM $MAINPID
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target
  • 测试启动脚本
systemctl restart nginx
systemctl stop nginx
systemctl enable --now nginx
[root@centos7-1 nginx]# systemctl enable --now  nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@centos7-1 nginx]# systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-01-01 21:34:07 CST; 1min 22s ago

在这里插入图片描述

▶ 5.Nginx目录结构

  • /etc/nginx/nginx.conf:主配置文件
    • 主配置文件:nginx.conf(include了conf.d/*.conf)
    • fastcgi, uwsgi,scgi等协议相关的配置文件:fastcgi_paramsuwsgi_paramsscgi_params
    • 支持的MIME类型配置文件:mime.types
  • /usr/lib/systemd/system/nginx.service:Nginx服务
  • /usr/lib64/nginx/modules:存放模块
  • /usr/sbin/nginx:主程序
  • /usr/share/nginx/html/:web服务文件的默认存放位置

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!