• nginx安装升级及配置详解


    1.简介

    2.安装配置

    3.配置文件介绍

    4.启动、停止、平滑重启、升级

     

    一、Nginx简介

        Nginx(engine x)是俄罗斯人Igor Sysoev编写的一款高性能的http和反向代理服务器。在连接高并发的情况下,nginx是apache服务器不错的替代品,它能够支持50000个并发连接数的响应,而内存、cpu等系统资源资源消耗却非常低,运行非常稳定。

    性能优势:

        作为web服务器,处理静态文件、索引文件及自动索引效率高

        作为代理服务器,快速高效反向代理

        作为负载均衡服务器

        性能,支持多并发的连接,占用低内存

        稳定,采用分段资源分配技术

        高可用,支持热部署,启动迅速

    其它特点:

    成本低廉;

    配置文件非常简单;

    支持Rewrite重写规则,能够根据域名、URL的不同,将http请求分到不同的后端服务器群组;

    内置健康检查功能,如果nginx proxy后端的某台web服务器宕机了,不会影响到前端的访问;

    节省带宽,支持gzip压缩;

    二、Nginx安装与配置

    编译安装

    1.首先下载gcc编译器以及nginx一些模块的依赖库,通常有pcre库(支持rewrite模块),zlib(支持gzip模块)库,openssl(支持ssl模块)库等。这些库可以编译安装,也可以yum安装,这里选择yum安装。

    # yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

     

    2.然后选择nginx版本下载源码并解压

    # wget http://nginx.org/download/nginx-1.12.2.tar.gz

    # tar –zxvf nginx-1.12.2.tar.gz –C /PATH

     

    3.使用configure脚本自动生成Makefile文件,nginx的configure脚本支持常用选项如下,但首先给出一个例子:

    ./configure --prefix=/usr/local/nginx
    --conf-path=/etc/nginx/nginx.conf
    --error-log-path=/datadisk/data/log/nginx/error.log
    --http-log-path=/datadisk/data/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_realip_module
    --with-http_addition_module
    --with-http_sub_module
    --with-http_dav_module
    --with-http_flv_module
    --with-http_mp4_module
    --with-http_gunzip_module
    --with-http_gzip_static_module
    --with-http_random_index_module
    --with-http_secure_link_module
    --with-http_stub_status_module
    --with-http_auth_request_module
    --with-threads --with-stream
    --with-stream_ssl_module
    --with-http_slice_module
    --with-file-aio
    --with-http_v2_module
    --with-ipv6

    然后make && make install即可。

    Nginx之configure选项

    1. 通用配置项

    --prefix=<path>:Nginx 安装的根路径,所有其他的路径都要依赖于该选项。

    --sbin-path=<path>:指定 Nginx 二进制文件的路径。如果没有指定,那么这个路径会依赖于 --prefix 选项。

    --conf-path=<path>:如果在命令行没有指定配置文件,那么将会通过这里指定路径,Nginx 将会去那里查找它的配置文件。

    --error-log-path=<path>:指定错误文件的路径,Nginx 将会往其中写入错误日志文件,除非有其他的配置。

    --pid-path=<path>:指定的文件将会写入 Nginx master 进程的 pid,通常在 /var/run 下。

    --lock-path=<path>:共享存储器互斥锁文件的路径。

    --user=<user>:worker 进程运行的用户。

    --group=<group>:worker 进程运行的组。

    --with-file-aio:为 FreeBSD 4.3+ 和 Linux 2.6.22+ 系统启用异步 I/O。

    --with-debug:这个选项用于启用调试日志。在生产环境的系统中不推荐使用该选项。

    2. 配置优化选项

    --with-cc=<path>:如果想设置一个不在默认 PATH 下的 C 编译器。

    --with-cpp=<path>:设置 C 预处理器的相应路径.

    --with-cc-opt=<options>:指定必要的 include 文件路径,可能 d(-I<path)指出,也可能是优化(-O4)和指定一个 64 位构建。

    --with-ld-opt=<options>:包含连接器库的路径(-L<path>)和运行路径(-R<path>)

    --with-cpu-opt=<cpu>:通过该选项为特定的 CPU 构建 Nginx。

    3. mail 配置选项

    --with-mail:该选项用于启用 mail 模块,该模块默认没有激活。

    --with-mail_ssl_module:为了代理任何一种类型的使用 SSL/TLS 的 mail,激活该模块。

    --without-mail_pop3_module:在启用 mail 模块后,单独地禁用 POP3 模块。

    --without-mail_imap_module:在启用 mail 模块后,单独地禁用 IMAP 模块。

    --without-mail_smtp_module:在启用 mail 模块后,单独地禁用 SMTP 模块。

    --without-http:该选项将完全禁用 http 模块,如果你只想支持 mail,那么可以使用它。

    对于典型的 mail 代理,可配置为如下:

    ./configure --with-mail --with-mail_ssl_module --with-openssl=${BUILD_DIR}/openssl-1.0.1p

    对于邮件服务器来说,现在几乎每一个邮件服务器的安装都需要安装 SSL/TLS,并没没有一个邮件代理启用了预期功能的用户。推荐静态编译 OpenSSL,以便对操作系统中的 OpenSSL 库没有依赖性。

    4. http 配置选项

    --without-http-cache:在使用 upstream 模块时,Nginx 能够配置本地缓存内容。这个选项能够禁用缓存。

    --with-http_perl_module:Nginx 配置能够扩展使用 Perl 代码。这个选项启用这个模块(然而使用这个模块会降低性能)。

    --with-perl_modules_path=<path>:对于额外嵌入的 Perl 模块,使用该选项指定该 Perl 解析器的路径。也可以通过配置选项来指定 Perl 模块解析器的位置。

    --with-perl=<path>:如果在默认的路径中没有找到 Perl,那么指定 Perl(5.6 版本以上)的路径。

    --http-client-body-temp-path=<path>:从客户端收到请求后,该选项设置的目录用于作为请求体临时存放的目录。如果 WebDAV 模块启用,那么推荐设置该路径为同一个文件系统上的目录作为最终的目的地。

    --http-proxy-temp-path=<path>:在使用代理后,通过该选项设置存放临时文件路径。

    --http-fastcgi-temp-path=<path>:设置 FastCGI 临时文件的目录。

    --http-uwsgi-temp-path=<path>:设置 uWSGI 临时文件的目录。

    --http-scgi-temp-path=<path>:设置 SCGI 临时文件的目录。

    --with-http_ssl_module:如果需要对流量进行加密,那么可以使用这个选项,在 URLs 中开始部分将会是 https(需要 OpenSSL)。

    --with-http_realip_module:如果你的 Nginx 在七层负载均衡器或者是其他设备之后,它们将 Http 头中的客户端 IP 地址传递,那么你将会需要启用这个模块。在多个客户处于一个 IP 地址下使用。

    --with-http_addition_module:这个模块作为一个输出过滤器,使你能够在请求经过一个 location 前或者后时在该 location 本身添加内容。

    --with-http_xslt_module:该模块用于 XML 响应转换,基于一个或者多个 XSLT 格式(需要 libxml2 和 libxslt 库)。

    --with-http_image_filter_module:该模块被作为图像过滤器使用,在将图像投递到客户之前进行处理(需要 libgd 库)。

    --with-http_geoip_module:使用该模块,能够设置各种变量以便在配置文件中的区段使用,基于地理位置查找客户端 IP 地址(需要 MaxMfind GeoIP 库和相应的预编译数据库文件)。

    --with-http_sub_module:该模块实现了替代过滤,在响应中用一个字符串替代另一个字符串。

    --with-http_dav_module:启用这个模块将激活使用 WebDAV 的配置指令。请注意,这个模块也只在有需要使用的基础上启用,如果配置不正确,它可能带来安全问题。

    --with-http_flv_module:如果需要提供 Flash 流媒体视频文件,那么该模块将会提供伪流媒体。

    --with-http_mp4_module:这个模块支持 H.264/AAC 文件伪流媒体。

    --with-http_gzip_static_module:当被调用的资源没有 .gz 结尾格式的文件时,如果想支持发送预压缩版本的静态文件,那么使用该模块。

    --with-http_gunzip_module:对于不支持 gzip 编码的客户,该模块用于为客户解压缩预压缩内容。

    --with-http_random_index_module:如果你想提供从一个目录中随机选择文件的索引文件,那么这个模块需要被激活。

    --with-http_secure_link_module:该模块提供了一种机制,它会将一个哈希值链接到一个 URL 中,因此,只有那些使用正确的密码能够计算链接。

    --with-http_stub_status_module:启用这个模块后会收集 Nginx 自身的状态信息。输出的状态信息可以使用 RRDtool 或类似的东西来绘制成图。

    对于网络加速/代理,可如下配置:

    ./configure --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_stub_status_module --with-openssl=${BUILD_DIR}/openssl-1.0.1c

    对于 Web 服务器:

    ./configure --with-http_stub_status_module

    这两个配置不同之处在于它们面对的客户,处于 Web 加速时,会考虑到 SSL 请求的终结,也包括处理代理客户和基于客户来源决策。处于 Web 服务时,则仅需要提供默认文件访问能力。

    5. 禁用的配置选项

    --without-http_charset_module:该字符集模块负责设置 Content-Type 响应头,以及从一个字符集转换到另一个字符集。

    --without-http_gzip_module:gzip 模块作为一个输出过滤器,在将内容投递到客户时对内容进行压缩。

    --without-http_ssi_module:该模块是一个过滤器,用于处理 SSI 包含。如果启用 Perl 模块,那么额外的 SSI 指令(perl)可用。

    --without-http_userid_module:userid 模块能够使得 Nginx 设置 cookies,用于客户标识。变量 $uid_set 和 $uid_got 可以记录用户跟踪。

    --without-http_access_module:access 模块基于 IP 控制访问 location。

    --without-http_auth-basic_module:该模块通过 Http 基本身份验证限制访问。

    --without-http_autoindex_module:如果一个目录中没有 index 文件,那么 autoindex 模块收集这个目录列出文件。

    --without-http_geo_module:该模块能够让你基于客户端 IP 地址设置配置变量,然后根据这些变量的值采取行动。

    --without-http_map_module:map 模块能够让你映射一个变量到另一个变量。

    --without-http_split_clients_module:该模块创建用于 A/B 测试的变量。

    --without-http_referer_module:该模块能够让 Nginx 阻止基于 Referer Http 头的请求。

    --without-http_rewrite_module:通过 rewrite 模块能够让你基于变量条件改变 URI。

    --without-http_proxy_module:使用 proxy 模块允许 Nginx 将请求传递到其他服务器或者服务器组。

    --without-http_fastcgi_module:FastCGI 模块能够让 Nginx 将请求传递到 FastCGI 服务器。

    --without-http_uwsgi_module:这个模块能够使得 Nginx 将请求传递到 uWSGI 服务器。

    --without-http_scgi_module:SCGI 模块能够让 Nginx 将请求传递到 SCGI 服务器。

    --without-http_memcached_module:该模块能够使得 Nginx 与一个 memcached 服务器进行交互,将响应放置到变量查询中。

    --without-http_limit_conn_module:该模块能够使得 Nginx 基于某些键,通常是 IP 地址,设置连接限制。

    --without-http_limit_req_module:通过该模块,Nginx 能够限制每个用户的请求率。

    --without-http_empty_gif_module:在内存中产生一个 1 像素 * 1 像素的透明 GIF 图像。

    --without-http_browser_module:browser 模块允许基于 User-Agent Http 请求头配置,变量的设置基于在该头中发现的版本。

    --without-http_upstream_ip_hash_module:该模块定义了一组可以与不同的代理模块结合使用的服务器。

    三、nginx配置文件详解

    nginx.conf文件的结构
    
    …                     #全局快
    
    events                #events块
    
    {
    
        …
    
    }
    
    http                  #http块
    
    {
    
        …                 #http全局块
    
        server            #server块
    
      {
    
        …                 #server全局块
    
            location      #location块
    
            {
    
                …
    
          }
    
      }
    
    }

    nginx.conf文件由三部分组成,全局块、http块和events块。http块中可以包含多个server块,一个server块中又可以包含多个location块。

    如果某指令在不同层级的块中出现,则采用"就近原则",以较低级的块配置为准。

    首先看看各个块的作用

    1. 全局块。是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响nginx服务器整体运行的配置命令,也就是全局配置。通常包括配置运行nginx服务器的用户(组),worker process数,pid存放路径,日志路径及配置文件引入等等。
    2. events块。主要设置影响nginx服务器与用户的网络连接,对服务器性能影响很大。常用的是设置是否开启对多worker process下的网络连接序列化,是否允许同时接受多个网络连接,选取事件驱动模型,每个worker process最大连接数等。
    3. http块。可以包含server块的配置,主要配置代理、缓存和日志等和第三方模块。http全局块中配置的指令包括文件引入、mime-type定义、日志定义、连接超时时间和单连接请求数上限等。
    4. server块。每个server块就相当于一个虚拟主机。server块中常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或者ip配置。
    5. location块。location块其实是server块中的一个指令。此块的主要功能是,基于nginx服务器接收到的请求字符串,对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等,第三方模块也是在这块中配置。

    Nginx配置文件nginx.conf简单介绍

      1 #Nginx运行的用户和用户组
      2 #user nobody; #默认
      3 user nginx nginx; #user user[group];
      4  
      5 #nginx进程数,一般为CPU总核心数
      6 worker_processes 8; #worker_processes number|auto;
      7 
      8  
      9 #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] 设置某一级别后,比这一级别高的日志也会被记录
     10 
     11 error_log /usr/local/nginx/logs/error.log info;
     12 
     13  
     14 
     15 #进程pid文件
     16 pid /usr/local/nginx/logs/nginx.pid;
     17 
     18  
     19 
     20 #配置文件的引入,支持相对路径
     21 include conf.d/*.conf;            #include file;
     22 
     23 events
     24 
     25 {
     26 
     27     #对多个nginx进程接受连接进行序列化,防止惊群问题。
     28     accept_mutex on | off;
     29 
     30 
     31     #事件驱动模型选择,后续再说。
     32     use epoll;
     33     
     34  
     35     #单个进程最大连接数,尽量大。理论上每台nginx服务器的最大连接数为65535。
     36     worker_connections 65535;
     37 
     38 }
     39 
     40 
     41 http{
     42 
     43     #文件扩展名与文件类型映射表。常用浏览器中可现实内容有html、xml、gif和flash等繁多资源,就需要使用到mime type,nginx作为web服务器,就需要识别前端请求的资源类型。此处定义了一个types结构,结构中包含了浏览器能够识别的mime类型以及对应于相关类型的文件后缀名。
     44 
     45     include mime.types;
     46 
     47     #默认文件类型
     48     default_type application/octet-stream;
     49 
     50 
     51     #对服务日志的格式、大小、输出等配置,需要用到log_format和access_log。此语法格式为log_format name string ...; nginx预设的一些内置变量获取相关内容,string整体使用单括号括起来。
     52 
     53     log_format main '$remote_addr - $remote_user [$time_local] "$request" '
     54     '$status $body_bytes_sent "$http_referer" '
     55     '"$http_user_agent" "$http_x_forwarded_for"';
     56 
     57     #access_log path[format[buffer=size]],main就是上面格式的名称。
     58     access_log logs/access.log main;
     59 
     60  
     61 
     62 #日志格式设定
     63 #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
     64 #$remote_user:用来记录客户端用户名称;
     65 #$time_local: 用来记录访问时间与时区;
     66 #$request: 用来记录请求的url与http协议;
     67 #$status: 用来记录请求状态;成功是200,
     68 #$body_bytes_sent :记录发送给客户端文件主体内容大小;
     69 #$http_referer:用来记录从那个页面链接访问过来的;
     70 #$http_user_agent:记录客户浏览器的相关信息;
     71 
     72 #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
     73 
     74 
     75 #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
     76 sendfile on;
     77 
     78 #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
     79 tcp_nopush on;
     80 tcp_nodelay on;
     81 
     82 #连接超时时间,单位秒
     83 keepalive_timeout 120; #keepalive_timeout timeout[header_timeout];
     84 
     85 #开启gzip压缩输出
     86 gzip on;
     87 
     88 
     89 #基于名称的虚拟主机的配置
     90 server{
     91     listen 80;
     92 
     93     #域名可以有多个,用空格隔开,name中还可使用正则表达式,波浪号~作为正则表达式开始的标记
     94    server_name www.server.com myserver.com;
     95
     96  
     97     #配置location块。语法为location [ = | ~ | ~* | ^~ ] uri {…}
     98 其中,uri是待匹配的请求字符串,不含正则的uri为标准uri,含正则的uri为正则uri。
     99 
    100     #"=",用于标准uri前,要求请求字符串与uri严格匹配。如果匹配成功就停止继续向下搜索并立即处理此请求。
    101 
    102     #"~",用于表示正则uri,区分大小写
    103 
    104     #"~*",用于表示正则uri,不区分大小写
    105 
    106     location / {
    107 
    108     #配置请求的根目录及默认首页
    109     root /data/www;
    110     index index.html index.htm index.php;
    111 
    112 
    113    #location的uri还可以通过alias更改,下面的location块接收到/data/index.html时,匹配成功,通过alias服务器将到/locationtest/other找到index.html响应请求。
    114 
    115    location ~ ^/data/(.+.(html|htm))$ {
    116         alias /locationtest/other/$1;
    117    }
    118 
    119  
    120    #基于ip配置nginx的访问权限,deny禁止,allow允许,下面的禁止192.168.1.1而192.168.1.0/24的客户端是可以访问的。因为是按顺序进行访问权限的检查。遇到匹配的,停止向下搜索相关配置。
    121    location ~ /.ht {
    122       deny 192.168.1.1;
    123       allow 192.168.1.0/24;
    124       deny all;
    125    }
    126 
    127    #设置网站的错误页面,语法为error_page code ...[=[response]] uri
    128    error_page 500 502 503 504 /50x.html;
    129      location = /50x.html {
    130      root html;
    131    }
    132 
    133     }
    134 
    135 }
    136 }

    四、启动、停止、平滑重启、升级

        Nginx的信号控制

            TERM,INT 快速关闭

            QUIT 从容关闭(处理完当前请求关闭进程)

            HUP 平滑重启,重新加载配置文件(此操作不会中断用户的访问请求)

            USER1 重新打开日志文件,在切割日志时用途较大

            USR2 平滑升级可执行程序

            WINCH 从容关闭工作进程

    启动

        systemctl start nginx

        若无法启动,则 执行以下命令 /usr/sbin/nginx -c /etc/nginx/nginx.conf

        参数"-c"指定了配置文件的路径,如不加,则默认加载安装目录的conf子目录中的nginx.conf文件 

     

    停止

     Nginx主进程号可通过cat /run/nginx.pid 或者 ps –ef | grep nginx 查看。worker process 表示它们为子进程。3426为主进程。

    从容停止

    kill –QUIT nginx主进程号

    或者kill –QUIT 'ps -ef | grep "nginx: master" | grep -v "grep" | awk -F ' ' '{print $2}''

    快速停止

    kill –TERM 主进程号

    kill –INT 主进程号

    强制停止

    pkill -9 nginx 主进程号

     

    平滑重启

      如果改变了nginx的配置文件,想重启nginx,同样可以通过发送系统信号给nginx主进程的方式来进行。不过在重启之前要确认配置文件语法是否正确,否则nginx不会加载新的配置文件。可通过以下命令来判断nginx配置文件是否正确。

    /usr/sbin/nginx -t -c /etc/nginx/nginx.conf

    错误则显示如下:

    正确则显示如下:

    此时可平滑重启nginx了

    Kill –HUP nginx主进程号

      当Nginx接受到HUP信号时,它会尝试先解析配置文件,如果成功,就应用新的配置文件。之后,nginx运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字,但继续为当前连接的客户提供服务。所有客户端服务完成后,旧的工作进程被关闭。

    平滑升级

        可在不中断服务的情况下,使用新版本、重编译的nginx可执行程序替换旧版本的可执行程序。步骤如下:

        

        下载nginx源码包http://nginx.org/en/download.html

        nginx-1.13.0.tar.gz

        安装编译器及环境依赖

    # yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel –y

    解压缩

    # tar -zxvf nginx-1.13.0.tar.gz -C /usr/src/ --no-same-owner

    编译但不安装

    # ./configure --user=nginx --group=nginx && make

    1.查看旧的版本号,备份旧的可执行文件。

    # nginx –v

    # cp /usr/sbin/nginx nginx.bak

     

    2.kill –USR2 旧版本的nginx主进程号。并替换旧的可执行文件。

    # kill –USR2 22855

    # cd /usr/src/nginx-1.13.0/objs

    # cp -rf nginx /usr/sbin/

     

    3.旧版本nginx的主进程将重命名它的.pid文件为.oldbin(比如:/run/nginx.pid.oldbin),

     

    # kill -QUIT旧版本的nginx主进程号。

    此时旧的主进程会移除.oldbin后缀,恢复为.pid文件,并且可以查看到nginx已经升级成功。

     

    注:在以上第二步的时,一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出。仅由新的工作进程来处理输入的请求了。

    到此还可以决定是否使用新版本,还可以恢复到旧版本。

    kill –HUP 旧的主进程号

    kill –QUIT 新的主进程号

    kill –TERM 新的主进程号

        新的主进程退出后,旧的主进程会移除.oldbin后缀,恢复为它的.pid文件,这样就恢复到升级之前了。

     

     

  • 相关阅读:
    SpringCloud入门须知
    24SQL FOREIGN KEY 约束
    23SQL PRIMARY KEY 约束
    python之一列表集合转为字典
    DesktopSwitcher 开发
    Distribute the App on the Website
    Apple Developer账号申请
    后端——框架——视图层框架——spring mvc——注解
    后端——框架——视图层框架——spring mvc——数据(校验,转换,格式化)
    后端——框架——视图层框架——spring mvc——ExceptionResolver
  • 原文地址:https://www.cnblogs.com/whych/p/9521597.html
Copyright © 2020-2023  润新知