1

以下备忘 Nginx 中基础配置的含义。

nginx.conf

/etc/nginx 中可以找到 nginx.conf 配置文件,其配置及注释如下:

# 运行 Nginx worker 进程的用户群组为 nginx
user  nginx;

# 工作进程的数量,一般与 CPU 的核数相关
worker_processes  1;

# 错误日志的目录。最后一项为错误日志的级别
error_log  /var/log/nginx/error.log warn;

# 保存主进程的进程 id 的位置
pid        /var/run/nginx.pid;

# 设置一个工作进程可以连接的数量
events {
    worker_connections  1024;
}


http {
    # ...
}

有关错误日志的级别可以参考:「Nginx error_log 错误日志级别」。

http 模块

nginx.conf 中包含一个重要模块,其配置及注释如下:

# --- nginx.conf ----

# 其他配置

http {
    # 这个文件告诉浏览器文件所属的类型
    include       /etc/nginx/mime.types;
    
    # 设置了默认的类型(默认为二进制)
    default_type  application/octet-stream;

    # 设置日志记录的一种格式,main 为名字
    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 长连接延时
    keepalive_timeout  65;

    #gzip  on;

    # 包含的额外配置位置
    include /etc/nginx/conf.d/*.conf;
}

该段配置中有一些比较重要的部分:

mime.types

该文件为 /etc/nginx/mine.types,表示针对不同文件类型会返回给浏览器的 Content-Type 头部信息,以下是该文件的部分内容:

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;
    
    # 其他内容
}

有关这一部分的详细信息可以查看:「Nginx -- mime.types」和「HTTP Content-Type」。

log_format

该项配置了日志记录的格式,具体可以参考:「使用 log_format 为 Nginx 服务器设置更详细的日志格式」。

server 模块

由于在 nginx.conf 中存在下面这条配置,使得所有在该目录下,文件名以 .conf 结尾的文件都会被当作配置文件引入:

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

而在 /etc/nginx/conf.d/ 目录下,提供了一个 default.conf 文件,以下是该文件部分内容及注释:

# 每一个 server 定义了一个虚拟主机
server {
    # 端口号
    listen       80;
    
    # 访问的主机名
    server_name  localhost;

    #charset koi8-r;
    
    # 这里可以覆盖 http 中的配置
    #access_log  /var/log/nginx/log/host.access.log  main;
    
    # 其他配置
}

在 server 模块中,location 是非常重要的配置项,我们可以使用它完成很多需求。

简单的请求匹配

我更倾向于把它称为路由匹配,即根据请求的类型转发到相应的代码中进行处理,和路由器根据路由表转发数据包的过程很是相似。

server {
    
    # 其他配置
    
    server_name my.app.dev;
    
    location / {
        # 匹配时转发到的目录
        root   /usr/share/nginx/html;
        
        # 如以 my.app.dev 访问,则尝试访问 
        # my.app.dev/index.html 
        # 或 
        # my.app.dev/index.htm
        index  index.html index.htm;
    }
    
    # 其他配置
    
}

这是一个简单的配置,所有以 my.app.dev 发起到该主机的请求都会与这一配置匹配。如请求 my.app.dev/a.html 则相当于访问 /usr/share/nginx/html/a.html 文件(注意配置域名解析到该服务器),该路径为 root 配置内容。

正则匹配

当然也可以使用正则表达式定义:

location ~* \.(jpg|jpeg|gif|png)$ {
    root   /usr/share/nginx/static/images;
}

该配置表示对图片类的静态资源的转发,其中 \.(jpg|jpeg|gif|png)$ 为正则内容;

~* 表示请求不区分大小写,关于此类规则可以参考:「Nginx location 匹配规则」。

反向代理

我们还可以进行反向代理配置:

location /api {
    # 代理转发
    proxy_pass http://api.app.dev;
    
    # 保留请求方的真实 IP
    proxy_set_header X-Real-IP $remote_addr;
    
    # 追加代理 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
}

在使用代理后,如果想让代理后的服务器得到的请求地址仍是真实的客户,而不是代理服务器,则需要增加上述配置的下面两行。有关这二者的区别和更为详细的信息可以分别参考:「X-Forwarded-For 和 X-Real-IP 的区别?」和「怎样正确设置 remote_addr 和 x_forwarded_for」。

FastCGI

对于某些需要借助额外处理过程的文件,Nginx 需要将请求转发给实现了 CGI 或 FastCGI 的进程进行处理。在 PHP 中即为 php-fpm:

location ~ \.php$ {

    # 注意,Nginx 和 FastCGI 通信具有两种形式,TCP 和 UNIX Socket 方式
    # 默认为 socket 方式
    # fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    
    # 或使用 TCP 方式
    fastcgi_pass   127.0.0.1:9000;
    
    # 默认索引文件
    fastcgi_index  index.php;
    
    # 额外的参数:请求的脚本文件位置
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    
    # 引入额外的 FastCGI 配置
    include        fastcgi_params;
}

其中:fastcgi_pass 表示将该类请求转发到哪个进程,这里配置为 127.0.0.1:9000 是因为 php-fpm 默认监听 9000 端口。

这里的 $document_root$fastcgi_script_name 分别表示 root 配置指定的位置及脚本名称。二者连起来即为脚本文件的请求路径。详细信息可以参考「Nginx 内置预定义变量」和「fastcgi_param 详解 - CSDN」。

include fastcgi_params 为引入 /etc/nginx/fastcgi_params 文件。

地址重写

又称为伪静态,可以通过以下方式配置:

location / {
    index  index.php;
    try_files $uri $uri/ /index.php?$query_string;
}

try_files 后附带三个参数(可以配置多个,中间用空格分隔),对于一个请求,会依次尝试这三者。如对于请求 my.app.dev/comments/1,依次尝试:

  1. my.app.dev/comments/1 按照 root 配置所表示的文件;

  2. my.app.dev/comments/1/。这里是目录,会继续按照 index 配置查找如 index.html 等文件;

  3. my.app.dev/index.php。注意,虽然转发到这个文件,但请求的 url 仍是 my.app.dev/comments/1,一般在 index.php 中会有请求解析模块专门进行匹配。

一般地址重写都是动态语言的需求,所以地址重写配置往往和 FastCGI 配置一同出现。

匹配顺序

同路由表的匹配规则类似,请求的匹配大体上也遵循最长匹配,具体规则如下(引用自:Nginx location 匹配规则):

  1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索;

  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止;

  3. 正则表达式,在配置文件中定义的顺序;

  4. 如果第 3 条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。

默认匹配

在配置了 location / {...} 后,由于所有请求都属于这一格式。在没有更为精确的匹配符合的情况下,会进入这一配置中,实际上相当于缺省配置。

当然,我们也可以用以下方式配置一个默认(缺省)的 server:

server {
    listen 80 default_server;
    root /default/root;
    #root return 444;
}

使用 default_server 标注其为默认 server。这里也可以把 root /default/root 改为 root return 444,表示当必须使用默认 server 时,直接返回 444 HTTP 状态码。而又由于没有这一状态码,浏览器中会直接显示 网页无法正常工作

404 错误问题

当访问已正确配置的地址却出现 403 错误时,有可能是 SELinux 导致的。

先执行以下命令:

getenforce

如果出现 Enforcing 结果,则需要改变安全上下文:

chcon -Rt httpd_sys_content_t /your/web/dir

详细内容可以参考 「查看 SELinux 状态及关闭 SELinux」 和 「Chcon 命令」。


参考

  1. 查看 SELinux 状态及关闭 SELinux

  2. Chcon 命令

  3. Nginx error_log 错误日志级别

  4. Nginx -- mime.types

  5. HTTP Content-Type

  6. 使用 log_format 为 Nginx 服务器设置更详细的日志格式 - 博客园

  7. nginx location 匹配规则

  8. X-Forwarded-For 和 X-Real-IP 的区别? - segmentfault

  9. 怎样正确设置 remote_addr 和 x_forwarded_for - CSDN

  10. Nginx 内置预定义变量

  11. fastcgi_param 详解 - CSDN

  12. NGINX:Web 服务器 - 宁皓网

  13. Ubuntu 16.04LTS LNMP环境配置 - 博客园


dailybird
1.1k 声望73 粉丝

I wanna.