WEB服务与NGINX(3)-NGINX基础及配置文件

WEB服务与NGINX(3)-NGINX基础及配置文件



1. NGINX初识与安装

NGINX是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器。

官方网站 https://nginx.org

NGINX有很多二次开发版本,例如:

Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目,官http://tengine.taobao.org/

OpenResty(章亦春):基于 Nginx 与 Lua 语言的高性能 Web 平台

1.1 NGINX特性

  • 高性能,高并发

    NGINX比其他web服务拥有更快的响应速度和更高并发处理能力,解决解决C10K问题(10K Connections)。

    这得益于NGINX优秀的I/O模型,如epoll,mmap,sendfile等机制的使用。

    低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存。

  • 高扩展性

    NGINX为高度模块化设计,并支持DSO动态加载技术(1.9.11版本以后支持),NGINX官方和第三方有很多优秀的模块可以让NGINX有很好的扩展性。

  • 高可靠性

    所谓高可靠性,是指Nginx可以在服务器上持续不间断的运行,而很多web服务器往往运行几周或几个月就需要进行一次重启(如IIS)。对于nginx这样的一个高并发、高性能的反向代理服务器而言,他往往运行网站架构的最前端,那么此时如果我们企业如果想提供9999、99999的高可用性,对于nginx持续运行能够宕机的时间,一年可能只能以秒来计算,所以在这样的一个角色中,nginx的高可靠性为我们提供了非常好的保证。

  • 支持热部署

    热部署是指在不停止服务的情况下升级nginx,这个功能非常的重要。对于普通的服务,只需要kill掉进程再启动即可完成升级,但对于Nginx而言,如果Nginx有很多的客户端连接,那么kill掉Nginx。Nginx会像客户端发送tcpreset复位包,但很多客户端无法很好的理解reset包,就会造成异常。由于 Nginx的master管理进程与worker工作进程的分离设计,使得Nginx能够在7x24小时不间断服务的前提下,升级Nginx的可执行文件。也支持不停止服务更新配置、更换日志文件等功能。

  • 应用广泛

1.2 NGINX功能和应用场景

NGINX实现的功能主要有:

  • 静态资源的WEB服务器,html,图片,js,css,txt等静态资源;
  • https协议的实现;
  • 结合FastCGI(LNMP),uWSGI(python)等协议反代动态资源请求;
  • http协议的反向代理服务器(7层);
  • TCP/UDP的通用反向代理服务器(4层);
  • 负载均衡服务器;
  • 缓存服务器;
  • pop3/imap4协议的反向代理服务器;

下图为NGINX的常见的应用场景:

image

1.3 NGINX程序架构

NGINX的程序架构图如下:

image

nginx为MASTER/WORKER结构:

  • 一个master主进程,主要作用为:

    • 负载加载和分析nginx配置文件;
    • 生成,管理,结束worker进程;
    • 建立,绑定,关闭socket连接;
    • 接收外部指定,重启,升级,关闭服务等;
    • 不中断服务实现平滑升级,应用新的配置文件;
    • 开启日志文件,获取文件描述符;
  • 多个worker进程,一般和CPU核心数保持一致,作用为:

    • 接收处理客户端的请求;
    • 与后端服务器通信,获取后端服务器处理结果;
    • 进行IO调用,获取响应数据;
    • 缓存数据,访问缓存索引,查询调用缓存数据;
    • 发送请求结果,响应客户端请求;
    • 接收主程序指令;
  • cache loader进程加载缓存索引文件信息后退出;

  • cache manager进程管理磁盘的缓存大小,超过预定值大小后最少使用数据将被删除;

[root@nginx01 ~]# ps -ef | grep nginx
root       3364      1  0 09:06 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      3442   3364  0 09:08 ?        00:00:00 nginx: worker process
nginx      3443   3364  0 09:08 ?        00:00:00 nginx: worker process

1.4 NGINX的模块化

nginx高度模块化,1.9.11版本支持DSO机制。DSO:动态支持模块的加载或卸载。

image

模块主要分类如下:

  • 核心模块:core module

    是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、 配置文件解析 、 事件驱动机制 、进程管理等核心功能。

  • 标准模块

    提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等等。

    • HTTP 模块: ngx_http_*

      • HTTP Core modules 默认功能
      • HTTP Optional modules 需编译时指定
    • Stream 模块:ngx_stream_*

    • 可选HTTP模块

      主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等。

    • Mail 模块:ngx_mail_*

      主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持。

  • 第三方模块

    是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。

    第三方模块查找地址:https://www.nginx.com/resources/wiki/modules/index.html。

    使用第三方模块需要编译安装nginx,使用./configure --add-module=PATH(静态模块)或--add-dynamic-module=PATH(动态模块)来编译第三方模块。

1.5 NGINX的安装

NGINX安装版本分为开发版,稳定版和过期版,一般我们安装稳定版stable。

NGINX的安装可以使用yum和源码安装两种方式,yum安装简单易维护,源码安装安装升级复杂,但是可以自定义相关功能,自定义安装的版本,自定义相关的路径。

1.5.1 NGINX yum方式安装

NGINX使用yum方式安装需要提前设置好yum源,yum源可以设置为epel源或nginx官方指定的源:

  • epel源

    使用epel源安装时nginx的版本较低,而且配置不易读;

  • 官方源

    使用官方源安装时nginx的版本较新,配置易读;

    官方源查看的的地址为:https://nginx.org/en/linux_packages.html

此处使用官方源为例进行安装。

  1. 配置nginx官方源

    [root@nginx01 ~]# cat /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
    
  2. 安装nginx

    [root@nginx01 ~]# yum install nginx
    
    #查看nginx基本信息
    [root@nginx01 ~]# rpm -qi nginx
    Name        : nginx
    Epoch       : 1
    Version     : 1.20.1
    Release     : 1.el7.ngx
    Architecture: x86_64
    Install Date: Sun 13 Jun 2021 09:57:10 AM CST
    Group       : System Environment/Daemons
    Size        : 2887431
    License     : 2-clause BSD-like license
    Signature   : RSA/SHA1, Tue 25 May 2021 09:56:24 PM CST, Key ID abf5bd827bd9bf62
    Source RPM  : nginx-1.20.1-1.el7.ngx.src.rpm
    Build Date  : Tue 25 May 2021 09:40:35 PM CST
    Build Host  : ip-10-1-17-17.eu-central-1.compute.internal
    Relocations : (not relocatable)
    Vendor      : NGINX Packaging <nginx-packaging@f5.com>
    URL         : https://nginx.org/
    Summary     : High performance web server
    Description :
    nginx [engine x] is an HTTP and reverse proxy server, as well as
    a mail proxy server.
    
  3. 查看nginx的启动脚本:

    [root@nginx01 ~]# cat /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
    ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
    ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"
    
    [Install]
    WantedBy=multi-user.target
    
  4. 启动nginx并查看状态

    #启动服务并加入开机自动启动
    [root@nginx01 ~]# systemctl start nginx.service 
    [root@nginx01 ~]# systemctl enable nginx.service 
    Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
    
    #查看服务状态
    [root@nginx01 ~]# systemctl status nginx.service 
    ● nginx.service - nginx - high performance web server
       Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
       Active: active (running) since Sun 2021-06-13 10:05:14 CST; 11s ago
         Docs: http://nginx.org/en/docs/
     Main PID: 3805 (nginx)
       CGroup: /system.slice/nginx.service
               ├─3805 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
               └─3806 nginx: worker process
    
    #查看nginx进程
    [root@nginx01 ~]# ps -ef | grep nginx
    root       3805      1  0 10:05 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx      3806   3805  0 10:05 ?        00:00:00 nginx: worker process
    
    #查看nginx监听端口
    [root@nginx01 ~]# ss -tnlp | grep nginx
    State      Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
    LISTEN     0      128                 *:80                              *:*                   users:(("nginx",pid=3806,fd=6),("nginx",pid=3805,fd=6))
    
  5. 可以查看nginx官方源使用的编译参数

    [root@nginx01 ~]# nginx -V
    nginx version: nginx/1.20.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
    
  6. 访问nginx

image

1.5.2 NGINX编译安装

  1. 准备编译安装的基础环境

    #安装编译工具
    [root@xuzhichao ~]# yum groupinstall "development tools"
    ......
    Installed:
      autoconf.noarch 0:2.69-11.el7        automake.noarch 0:1.13.4-3.el7   bison.x86_64 0:3.0.4-2.el7                       byacc.x86_64 0:1.9.20130304-3.el7   cscope.x86_64 0:15.8-10.el7       ctags.x86_64 0:5.8-13.el7          
      diffstat.x86_64 0:1.57-4.el7         doxygen.x86_64 1:1.8.5-4.el7     elfutils.x86_64 0:0.176-4.el7                    flex.x86_64 0:2.5.37-6.el7          gcc.x86_64 0:4.8.5-39.el7         gcc-c++.x86_64 0:4.8.5-39.el7      
      gcc-gfortran.x86_64 0:4.8.5-39.el7   git.x86_64 0:1.8.3.1-21.el7_7    indent.x86_64 0:2.2.11-13.el7                    intltool.noarch 0:0.50.2-7.el7      libtool.x86_64 0:2.4.2-22.el7_3   patch.x86_64 0:2.7.1-12.el7_7      
      patchutils.x86_64 0:0.3.3-4.el7      rcs.x86_64 0:5.9.0-7.el7         redhat-rpm-config.noarch 0:9.1.0-88.el7.centos   rpm-build.x86_64 0:4.11.3-43.el7    rpm-sign.x86_64 0:4.11.3-43.el7   subversion.x86_64 0:1.7.14-14.el7  
      swig.x86_64 0:2.0.10-5.el7           systemtap.x86_64 0:4.0-11.el7   
    
    Dependency Installed:
      apr.x86_64 0:1.4.8-5.el7                  apr-util.x86_64 0:1.5.2-6.el7                avahi-libs.x86_64 0:0.6.31-20.el7          boost-date-time.x86_64 0:1.53.0-28.el7            boost-system.x86_64 0:1.53.0-28.el7         
      boost-thread.x86_64 0:1.53.0-28.el7       bzip2.x86_64 0:1.0.6-13.el7                  cpp.x86_64 0:4.8.5-39.el7                  dwz.x86_64 0:0.11-3.el7                           dyninst.x86_64 0:9.3.1-3.el7                
      efivar-libs.x86_64 0:36-12.el7            emacs-filesystem.noarch 1:24.3-23.el7        gdb.x86_64 0:7.6.1-119.el7                 gettext-common-devel.noarch 0:0.19.8.1-3.el7      gettext-devel.x86_64 0:0.19.8.1-3.el7       
      glibc-devel.x86_64 0:2.17-307.el7.1       glibc-headers.x86_64 0:2.17-307.el7.1        gnutls.x86_64 0:3.3.29-9.el7_6             kernel-debug-devel.x86_64 0:3.10.0-1127.el7       kernel-headers.x86_64 0:3.10.0-1127.el7     
      libdwarf.x86_64 0:20130207-4.el7          libgfortran.x86_64 0:4.8.5-39.el7            libmodman.x86_64 0:2.0.1-8.el7             libmpc.x86_64 0:1.0.1-3.el7                       libproxy.x86_64 0:0.4.11-11.el7             
      libquadmath.x86_64 0:4.8.5-39.el7         libquadmath-devel.x86_64 0:4.8.5-39.el7      libstdc++-devel.x86_64 0:4.8.5-39.el7      m4.x86_64 0:1.4.16-10.el7                         mokutil.x86_64 0:15-2.el7.centos            
      mpfr.x86_64 0:3.1.1-4.el7                 neon.x86_64 0:0.30.0-4.el7                   nettle.x86_64 0:2.7.1-8.el7                pakchois.x86_64 0:0.4-10.el7                      perl-Data-Dumper.x86_64 0:2.145-3.el7       
      perl-Error.noarch 1:0.17020-2.el7         perl-Git.noarch 0:1.8.3.1-21.el7_7           perl-TermReadKey.x86_64 0:2.30-20.el7      perl-Test-Harness.noarch 0:3.28-3.el7             perl-Thread-Queue.noarch 0:3.02-2.el7       
      perl-XML-Parser.x86_64 0:2.41-10.el7      perl-srpm-macros.noarch 0:1-8.el7            python-srpm-macros.noarch 0:3-32.el7       rsync.x86_64 0:3.1.2-10.el7                       subversion-libs.x86_64 0:1.7.14-14.el7      
      systemtap-client.x86_64 0:4.0-11.el7      systemtap-devel.x86_64 0:4.0-11.el7          systemtap-runtime.x86_64 0:4.0-11.el7      trousers.x86_64 0:0.3.14-2.el7                    unzip.x86_64 0:6.0-21.el7                   
      zip.x86_64 0:3.0-11.el7                
    ......
    
    #安装nginx的依赖包
    [root@xuzhichao ~]# yum install pcre-devel openssl-devel zlib-devel pcre openssl zlib
    
    说明:
    pcre,pcre-devel:nginx的rewrite模块需要使用pcre正则表达式的语法
    zlib,zlib-devel:nginx的压缩功能需要此模块的支持
    openssl,openssl-devel:nginx使用ssl时需要此模块的支持
    
  2. 官方源码包下载并解压

    官方源码包的下载地址为:https://nginx.org/en/download.html

    [root@xuzhichao ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
    [root@xuzhichao ~]# ll -h nginx-1.20.1.tar.gz 
    -rw-r--r-- 1 root root 1.1M May 25 23:34 nginx-1.20.1.tar.gz
    
    #解压
    [root@xuzhichao ~]# tar xf nginx-1.20.1.tar.gz 
    [root@xuzhichao ~]# ll nginx-1.20.1 -d
    drwxr-xr-x 8 xu1 xu1 158 May 25 20:35 nginx-1.20.1
    
  3. 创建nginx账号

    [root@xuzhichao ~]# useradd -r -s /sbin/nologin nginx
    [root@xuzhichao ~]# id nginx
    uid=887(nginx) gid=887(nginx) groups=887(nginx)
    
  4. 创建nginx安装目录并修改属主属组

    [root@xuzhichao ~]# mkdir /apps/nginx
    [root@xuzhichao ~]# chown -R nginx:nginx /apps/nginx/
    
  5. 修改源码文件,隐藏不必要的信息

    #1. '进入解压目录'
    [root@xuzhichao ~]# cd nginx-1.20.1/
    #2. '编辑如下文件,找到所示行'
    [root@xuzhichao nginx-1.20.1]# vim src/core/nginx.h
    版本信息
    #define NGINX_VERSION      "1.20.1"
    服务名称        
    #define NGINX_VER          "nginx/" NGINX_VERSION
    
    #3. '修改禁用服务信息后,头部信息'
    [root@xuzhichao nginx-1.20.1]# vim src/http/ngx_http_header_filter_module.c
    配置文件中修改禁止显示版本信息后,头部显示的Server内容
    static u_char ngx_http_server_string[] = "Server: momo" CRLF;
    
  6. 编译,指定安装目录和启用的功能

    [root@xuzhichao nginx-1.20.1]# ./configure --prefix=/apps/nginx \
    > --conf-path=/etc/nginx/nginx.conf \
    > --sbin-path=/usr/sbin/nginx \
    > --error-log-path=/var/log/nginx/error.log \
    > --http-log-path=/var/log/nginx/access.log \
    > --pid-path=/var/run/nginx.pid \
    > --lock-path=/var/run/nginx.lock \
    > --http-client-body-temp-path=/var/cache/nginx/client_temp \
    > --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    > --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    > --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    > --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    > --user=nginx \
    > --group=nginx \
    > --with-http_ssl_module \
    > --with-http_v2_module \
    > --with-http_realip_module \
    > --with-http_dav_module \
    > --with-http_stub_status_module \
    > --with-http_gzip_static_module \
    > --with-pcre \
    > --with-stream \
    > --with-stream_ssl_module \
    > --with-stream_realip_module \
    > --with-file-aio
    ......
    Configuration summary
      + using system PCRE library
      + using system OpenSSL library
      + using system zlib library
    
      nginx path prefix: "/apps/nginx"
      nginx binary file: "/usr/sbin/nginx"
      nginx modules path: "/apps/nginx/modules"
      nginx configuration prefix: "/etc/nginx"
      nginx configuration file: "/etc/nginx/nginx.conf"
      nginx pid file: "/var/run/nginx.pid"
      nginx error log file: "/var/log/nginx/error.log"
      nginx http access log file: "/var/log/nginx/access.log"
      nginx http client request body temporary files: "/var/cache/nginx/client_temp"
      nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
      nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
      nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
      nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"
    

    以上编译选项中的含义如下:

    • --prefix=/usr/local/nginx <==安装路径

    • --conf-path=/etc/nginx/nginx.conf / <==主配置文件安装位置

    • --sbin-path=/usr/sbin/nginx <==指明nginx程序文件安装路径

    • --error-log-path=/var/log/nginx/error.log / <==错误日志文件安装位置

    • --http-log-path=/var/log/nginx/access.log / <==访问日志文件安装位置

    • --pid-path=/var/run/nginx.pid / <==指明pid文件安装位置

    • --lock-path=/var/run/nginx.lock / <==锁文件安装位置

    • --http-client-body-temp-path=/var/cache/nginx/client_temp <==客户端body部分的临时文件存放路径,服务器允许客户端使用put方法提交大数据时,临时存放的磁盘路径

    • --http-proxy-temp-path=/var/cache/nginx/proxy_temp <==作为代理服务器,服务器响应报文的临时文件存放路径

    • --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp <==作为fastcgi代理服务器,服务器响应报文的临时文件存放路径

    • --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp <==作为uwsgi代理服务器,服务器响应报文的临时文件存放路径

    • --http-scgi-temp-path=/var/cache/nginx/scgi_temp <==作为scgi反代服务器,服务器响应报文的临时文件存放路径

    • --user=nginx / <==指明以那个身份运行worker进程,主控master进程一般由root运行

    • --group=nginx / <==指明组运行身份

    • --with-http_ssl_module / <==加密相关模块

    • --with-http_v2_module / <==是否支持http2.0版本

    • --with-http_dav_module / <==是否支持dav

    • --with-http_stub_status_module /

    • --with-threads / <==是否启用线程

    • --with-file-aio <==是否启用异步IO

  7. 编译

    [root@xuzhichao nginx-1.20.1]# make
    
  8. 创建目录,将生成的模块和文件复制到对应的目录下

    [root@xuzhichao nginx-1.20.1]# make install
    
  9. 查看编译安装的选项

    [root@xuzhichao nginx-1.20.1]# nginx -V
    nginx version: nginx/1.20.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/apps/nginx --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_dav_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-file-aio
    
  10. 启动nginx程序

    [root@xuzhichao nginx-1.20.1]# nginx
    
  11. 编译安装的nginx无法使用systemctl管理,如果想让systemctl管理,需要编写nginx的unit文件

    [root@xuzhichao nginx-1.20.1]# cat /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t
    ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
    ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
    ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"
    
    [Install]
    WantedBy=multi-user.target
    
  12. 使用systemctl管理nginx

    [root@xuzhichao nginx-1.20.1]# systemctl daemon-reload
    
    [root@xuzhichao nginx-1.20.1]# systemctl start nginx
    [root@xuzhichao nginx-1.20.1]# systemctl status nginx
    ● nginx.service - nginx - high performance web server
       Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
       Active: active (running) since Sun 2021-06-13 12:11:42 CST; 6s ago
         Docs: http://nginx.org/en/docs/
      Process: 20143 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
      Process: 20142 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
     Main PID: 20146 (nginx)
       CGroup: /system.slice/nginx.service
               ├─20146 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
               └─20147 nginx: worker process
    

1.6 NGINX的程序环境

查看使用官方yum源安装的nginx的文件:

[root@nginx01 ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.20.1
/usr/share/doc/nginx-1.20.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

其中比较重要的文件如下:

  • 主配置文件

    /etc/nginx/nginx.conf

    /etc/nginx/conf.d/default.conf 默认网站配置文件

    /etc/nginx/conf.d/*.conf

  • 多用途邮件扩展

    /etc/nginx/mime.types

  • SCGI代理配置文件

    /etc/nginx/scgi_params

  • py代理配置文件

    /etc/nginx/uwsgi_params

  • fastcgi代理配置文件

    /etc/nginx/fastcgi.conf

  • 服务文件

    /usr/lib/systemd/system/nginx.service

  • 主程序

    /usr/sbin/nginx

  • 服务页面文件

    /usr/share/nginx/html/index.html

  • 日志文件

    /etc/logrotate.d/nginx

    /var/log/nginx

1.7 nginx命令说明

语法格式

nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

默认不加任何选项为启动nginx

常用选项如下:

选项 说明
-v 只显示版本信息
-V 查看版本和编译选项
-t 测试nginx配置文件语法是否正确
-c FILE 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
-g directives 在命令行中指明全局指令

使用示例如下:

[root@nginx01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@nginx01 ~]# nginx -v
nginx version: nginx/1.20.1

[root@nginx01 ~]# nginx -V
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

[root@nginx01 ~]# nginx -s reload

[root@nginx01 ~]# nginx -s stop

2. NGINX主配置文件

2.1 NGINX配置文件结构

  • 主配置文件:

    /etc/nginx/nginx.conf

  • 子配置文件

    include conf.d/*.conf

  • 主配置文件的配置指令格式

    directive value [value2 …];

    注意

    • 1.指令必须以分号结尾
    • 2.支持使用配置变量
  • 内建变量:由Nginx模块引入,可直接引用

    官方变量说明http://nginx.org/en/docs/varindex.html

  • 自定义变量:由用户使用set命令定义

    set variable_name value;

  • 引用变量:$variable_name

    官方有指令和模块的索引http://nginx.org/en/docs/

主配置文件结构:分为4个语句块

特定的指令需要放置在特定的语句块中才能生效。

  • 主语句块

    main block:     <==主配置段,即全局配置段,对http,mail都有效
    			event {
    							...
    				}  <==事件驱动相关的配置
    	include /usr/share/nginx/modules/*.conf;  <==此目录下的配置内容,可以生效			
    
  • http语句块

    http {
    	... 各server的公共配置
    	server { 每个server用于定义一个虚拟主机,nginx中没有中心主机,只有虚拟主机的概念
    			...
    			}
    	server {
    			server_name 虚拟主机名
    			root 主目录
    			alias 路径别名
    			location [OPERATOR] URL { 指定URL的特性,nginx通常使用URL而非绝对路径来定义目录特性
    					  ...
    					  if CONDITION {
    					  ...
    					  }
    			}
    	}
    }
    	include /etc/nginx/conf.d/*.conf;  <==关于http的配置文件,放在此目录也可以生效
    
  • 邮件语句块

    mail {
    		...
    	} mail 协议相关配置段,默认没有
    
  • stream语句块

    stream {
    			...
    	} stream 服务器相关配置段,默认没有
    

nginx官方源安装的默认配置文件如下:

[root@nginx01 ~]# cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

[root@nginx01 ~]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

2.2 NGINX主语句块指令说明

ngxin的main语句块分为以下四部分内容:

  • 正常运行必备的配置:例如nginx以什么身份运行
  • 优化性能相关的配置:例如并发连接数设置
  • 用于调试及定位问题相关的配置:日志文件
  • 事件驱动相关的配置:例如设置I/O模型

2.2.1 正常运行必备的配置

正常运行必备的配置,必须放主语句块中。

常用的指令如下:

  • user USERNAME [GROUP];

    指定worker进程的运行身份,如组不指定,默认和用户名同名,修改的用户要保证有访问页面文件的权限,如果不指定用户,默认为nobody。

    e.g. user nginx;

  • pid PID_FILENAME;

    指定存储nginx主进程PID的文件路径, PID文件随服务停止删除。

    e.g. pid /run/nginx.pid;

  • include FILENAME;

    导入其他路径的配置文件。

    e.g. include mime.types;

    e.g. include vhosts/*.conf;

  • load_module FILENAME;

    加载动态模块

    模块加载配置文件: /usr/share/nginx/modules/*.conf

    指明要装载的动态模块路径: /usr/lib64/nginx/modules

2.2.2 性能优化相关的配置

  • worker_processes NUMBER|auto;

    worker进程的数量;通常应该等于或小于当前主机的cpu的物理核心数,auto表示自动匹配cpu核心数。

    若设置的worker数量大于cpu核心数,会增加worker之间cpu的调度,反而影响cpu性能。

    支持环境:main

    e.g. worker_processes auto;

  • worker_cpu_affinity auto [cpumask] ;

    cpu亲源性设置,绑定cpu有利于使用cpu缓存。

    [cpumask] : 00000001(0号CPU)

    支持环境:main

    明确的指明把每一个进程绑定在指定CPU上,比如一号进程明确说明绑定在一号上面,它绝不在其它CPU核心上运行,二号进程绑定在二号CPU上,三号进程绑定在三号CPU上。所以这样一来,这三个进程一定不会被调度到其它核心上去了,但是其实这样是不可能避免进程间的切换的,因为我们虽然把它绑定在这颗CPU上并不意味着这个CPU不能运行其它进程。但是至少保证了这个对于Nginx这一个进程本身不用调度到其它CPU上去了,那带来的好处是这个进程自己的缓存不会失效,说白了就是如果说这个Nginx在运行时,我们这个Nginx进程加载了很多数据到CPU的二级缓存、一级缓存、一级指令缓存包括一级数据缓存,如果我们不幸的把它调度到另外一颗CPU上去,那在第一颗CPU的缓存的内容就会失效了,到另外一颗CPU缓存还需要重新加载的,所以我们一旦把进程绑定的话,我们这个进程自己曾经加载到CPU上的缓存即便这个进程被调度出去,等一会它在回来运行时,那些缓存却依然有效,所以保证了缓存的有效性。但是它却没办法避免进程切换。

    优点:能够提升CPU缓存的命中率;

    但是不能避免context switch,我们真正要想极端去优化Nginx所在的服务器的话,还有一种方法;这种方法可能需要一些别的技能来支撑了。如:开机的时候设定主机上四颗CPU有三颗都不被内核使用,这叫CPU隔离,所以一开机我们就事先说明,内核只能使用这一颗CPU。那这样一来,内核想调度任何进程就只能在第四颗CPU上调度。那开机完成以后,我们还要隔离中断,我们系统可能有很多中断,中断可能由硬件产生也可能是软中断,此处仅指硬件中断,硬件中断包括网卡上有报文到来或者我们的硬盘上有IO完成等等。这些也都从CPU上隔离,所以它不处理中断,也不接受任何进程调度。当启动完以后,我们明确说明第一个进程绑定在第一颗,第二个进程绑定在第二颗,第三个进程绑定在第三颗。那这三个进程不受内核调度,所以再也不会有其它进程到这颗CPU上运行了,那这就意味着专CPU专用,第一颗CPU只为运行Nginx,Nginx再也不会被切换出去了。所以这个Nginx但凡需要运行,它就自己牢牢霸占住第一颗CPU,充分发挥CPU每一时刻的运算能力来支撑Web服务的访问。

    那这样一来,三个worker线程启动起来以后,假如说每一个worker线程可以支持1万个并发,那三万个就很轻松拿下了。但是这需要做两个前提,第一,我们在启动OS时需要隔离出来这三颗CPU,第二,我们需要把中断处理从这三颗CPU上剥离出去才可以。

    #示例
    [root@nginx01 ~]# vim /etc/nginx/nginx.conf
    worker_cpu_affinity 0001 0010;
    说明:0001代表第一颗CPU,0010代表第二颗CPU,0100代表第三颗CPU,依次类推。
    
    #检查语法,重启nginx
    [root@nginx01 ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@nginx01 ~]# systemctl reload nginx
    
    #查看nginx的worker进程的CPU绑定关系
    [root@nginx01 ~]# ps axo comm,pid,ppid,psr | grep nginx
    nginx             4331      1   0
    nginx             4344   4331   0      <==绑定到第一颗CPU
    nginx             4345   4331   1      <==绑定到第二颗CPU
    
  • worker_priority number;

    指定worker进程的nice值,即优先级:[-20,19]

    这对于一个Web服务器来讲尤其是反代模式下的Web服务器或者是我们支持更高并发的Web服务器来讲这算是一个比较有效的设定。

    支持环境:main

    #默认nginx的nice值为0
    [root@nginx01 ~]# ps axo comm,pid,ppid,psr,ni | grep nginx
    nginx             4331      1   0   0
    nginx             4344   4331   0   0
    nginx             4345   4331   1   0
    
    #调整nginx的nice为-20,优先级最高
    [root@nginx01 ~]# vim /etc/nginx/nginx.conf
    worker_priority -20;
     
    [root@nginx01 ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@nginx01 ~]# systemctl reload nginx.service 
    
    [root@nginx01 ~]# ps axo comm,pid,ppid,psr,ni | grep nginx
    nginx             4331      1   0   0
    nginx             4428   4331   0 -20   <==nice值为-20
    nginx             4429   4331   1 -20
    
  • worker_rlimit_nofile number;

    Worker所有进程所能够打开的文件数量上限,如65535

    注意:此参数为所有worker进程打开文件的总数,应为worker_connections* worker_processes数

    这个数字包括nginx和客户端即后端服务器连接的总和,并发链接数不能大于最大打开文件数。

    支持环境:main

    e.g. worker_rlimit_nofile number 100000;

  • timer_resolution interval;

计时器解析度:降低此值,可减少gettimeofday()系统调用的次数,默认为每次请求到达都会进行一次系统调用。

这种无谓的系统调用次数我们用不到那么高的时候,降低这个值会在一定意义上提升Nginx性能的或者提升我们整个系统性能的。对于一个非常繁忙的服务器这点是不容忽略的。

可用来减少降低worker线程中的计时器的解析度,降低解析度以后带来的结果是,减少发起gettimeofday()这么一个系统调用,任何一个进程运行过程当中,如果系统调用很多,任何一次系统调用的发生必然会产生软中断,产生软中断的直接结果就是模式转换,每一次的模式转换必然会消耗时间。因为我们说过很多次,一个生产力非常强的进程应该把大量时间用在用户空间,那timer_resolution这个时间解析度有什么用呢?

我们简单举个例子:比如任何一个请求到达Nginx的时候Nginx就得响应它,响应完以后就得记录日志了,同时在日志中会记录时间。那因此一旦有用户请求到达,我们这边处理响应而要记录日志的话那么它必须要获取系统当前时间并记录在日志文件中。怎么获取系统时间呢?通过gettimeofdate来获取时间而后把这个结果再保存到日志文件中。而如果我们的时间解析度过大的话,带来的结果是他一秒钟就解析一千次,一秒钟就发起一千次系统调用,如果我把这个降低一点,比如100ms解析一次,那就意味着一秒钟只解析10次了。如果指定1s一次那就意味着1s钟只解析1次,但是我们知道时间解析度越低它的精准度就越小,时间解析度越高精度就越高。

因此为了提高性能,这个时间解析度应该是降低的。只要我们对于它的时间解析度要求不是特别高的话。

2.2.3 事件驱动相关的配置

在events语句块中可以设置很多性能相关设置。

  • worker_connections number;

    单个worker进程所能够打开的最大并发连接数数量(默认值为1024),太小发挥不了服务器性能,影响并发,太大超出服务器性能,超出极限后会宕机。

    总最大并发数:worker_processes * worker_connections

    支持环境:events

    e.g. worker_connections 10240;

  • use method;

    指明并发连接请求的处理方法 ,默认为(epoll)

    支持环境:events

    e.g. use epoll;

  • accept_mutex on | off;

    处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程(较空闲进程)可获得连接,造成“惊群”,影响性能。

    支持环境:events

    mutex称为互斥锁,所谓互斥锁就是独占的,一般而言,任何一个进程持有锁以后其它进程都是被排除在外的,叫排它锁.

  • multi_accept on;

    nginx服务器的每个工作进程可以同时接受多个新的网络连接,on为打开此功能,默认关闭。

    支持环境:events

[root@nginx01 ~]# vim /etc/nginx/nginx.conf
events {
    worker_connections  10240;                                                                                                   
    use epoll;
    accept_mutex on;
    multi_accept on;
}

2.2.4 调试和定位问题参数

  • daemon on|off;

    是否以守护进程方式运行nignx,默认是守护进程方式,修改后启动nignx会在前台运行,前台运行用于测试,docker等环境。

    支持环境: main

  • master_process on|off;

    是否以master/worker模型运行nginx;默认为on,off 将不启动worker,仅适用测试场景。

    支持环境: main

  • error_log file [level] ;

    错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了--with-debug选项时才有效。

    默认为error_log /var/log/nginx/error.log;

    支持环境: main, http, mail, stream, server, location

    level日志级别:

    debug|info|notice|warn|error|crit|alter|emerg

posted @ 2021-06-13 14:06  向往自由的独行者  阅读(469)  评论(0编辑  收藏  举报