CentOS 8 下 nginx 服务器安装及配置笔记

参考文档 nginx官方文档

参考文档 死磕nginx系列

在CentOS下,nginx官方提供了安装包可以安装

首先先安装前置软件

sudo yum install yum-utils

然后将nginx官方源加入到yum源中

#/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

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

nginx分为稳定和主线分支两个分支,默认为稳定分支,可以根据需要切换为主线分支sudo yum-config-manager --enable nginx-mainline

使用命令就可以安装nginx了

sudo yum install nginx

nginx运行管理

执行nginx命令可以开启服务器。

-?参数可以获取更多命令行参数

nginx -s stop|quit|reload|reopen可以控制服务器直接退出|结束工作并退出|重新加载配置文件(重启)|重新打开日志文件

ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'可以列出nginx的主进程pid和工作进程pid。

除了直接使用nginx命令管理服务器,还可以通过系统信号的方式向nginx传递信号,如kill -s QUIT 1628

nginx支持以下信号:

TERM, INT 直接关闭

QUIT 完成工作后关闭

HUP 重新加载配置并重启

USR1 重新打开日志文件

USR2 升级可执行文件

WINCH 关闭正常工作进程

其中加粗的可以直接控制单个工作进程。

通过信号机制,可以在不停机的情况下切换日志文件或者升级ngnix程序。

nginx配置

配置文件

nginx的配置文件放在/usr/local/nginx/conf,/etc/nginx或 /usr/local/etc/nginx中,默认文件名为nginx.conf。

可以将nginx程序相关配置放在nginx.conf中,将具体的服务相关放在conf.d文件夹下,然后通过在nginx.conf中include进去(还可以创建一个servers文件夹,放配置文件,然后通过创建软连接的方式链接到conf.d文件夹中,就可以通过命令行动态管理nginx配置)。

nginx配置文件以#为注释符号,每行配置以;为结束符号。

nginx配置文件遵循全局包括events、http块,http块包括server块,server块包括location块的结构。

nginx进行转发匹配时,优先全部匹配,没有完全匹配时进行最长的匹配。

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块,PATTERN支持正则表达式和等号判断
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  5. location块:配置请求的路由,以及各种页面的处理情况。

块命令

参考文档

命令位置作用参数
use全局块可以设定链接处理方式select,poll,kqueue,epoll,/dev/poll,eventport之一,默认为前两个,在Linux上推荐使用epoll
error_log全局块或server块可以设置服务器日志记录文件和级别,下级弱设置项会被上级覆盖有debug、info、notice、warn、error、crit级别可选,可以记录到文件也可以记录到内存memory:32m debug;
debug_connectionevent块设定只记录某个特定的IP的debug信息IP地址
servernames_hash_max_sizehttp块nginx使用哈希表储存信息,该项可以设定哈希表的最大大小最好为CPU种cache的倍数
servernames_hash_bucket_sizehttp块该项可以设定哈希表的桶大小最好为CPU种cache的倍数
listenserver块监听端口号,可以通过default_server参数设定默认服务器,默认第一个为默认服务器80等
server_nameserver块进行匹配的服务名。该项支持正则表达式,此时必须以~作为开头,包含{}的地址应加""符号比如www.cnblogs.com或IP地址
returnserver块返回值,比如返回444这样的未定义的HTTP状态码444
rootserver或location块可以设定请求重定向到的目录。本地目录
listenserver块可以设定server监听的端口端口号
proxy_passlocation块可以将请求进行代理转发地址和接口
fastcgi_passlocation块可以对PHP或其他语言提供的cgi接口进行代理转发地址和接口
fastcgi_paramlocation块传递参数在PHP中,后跟SCRIPT_FILENAME和脚本名为转发到某个脚本,后跟QUERY_STRING为转发到脚本的参数字符串

变量列表

参考文档

nginx中存在一些全局变量。

$args:这个变量等于请求行中的参数,同$query_string。

$is_args: 如果已经设置$args,则该变量的值为"?",否则为""。

$content_length: 请求头中的Content-length字段。

$content_type: 请求头中的Content-Type字段。

$document_uri: 与$uri相同。

$document_root: 当前请求在root指令中指定的值。

$host: 请求主机头字段,否则为服务器名称。

$http_user_agent: 客户端agent信息。

$http_cookie: 客户端cookie信息。

$limit_rate: 这个变量可以限制连接速率。

$request_method: 客户端请求的动作,通常为GET或POST。

$remote_addr: 客户端的IP地址。

$remote_port: 客户端的端口。

$remote_user: 已经经过Auth Basic Module验证的用户名。

$request_body_file`: 客户端请求主体的临时文件名。

$request_uri: 请求的URI,带参数

$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。

$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。

$server_name: 服务器名称。

$server_port: 请求到达服务器的端口号。

$request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。

$uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。

反向代理

nginx的负载均衡功能依赖于ngx_http_upstream_module模块,通过upstream伪指令设置后端,支持轮询/带权轮询/最少链接/ip-hash四种方式。

例如:

upstream dynamic {
    ip_hash

    server backend1.example.com      weight=5;
    server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;#最大失败次数
    server backend3.example.com      resolve;

    server backup1.example.com:8080  down;#暂不参与负载均衡
    server backup2.example.com:8080  backup;#预留后备服务器
}

然后使用proxy_pass http://dynamic这样的命令即可进行反向代理。

njs

可以使用njs在配置文件中进行一些判断或者流程控制。

cache

参考文档