资讯专栏INFORMATION COLUMN

Nginx 配置文件备忘

wdzgege / 2336人阅读

摘要:如对于请求,依次尝试按照配置所表示的文件。这里是目录,会继续按照配置查找如等文件。在没有更为精确的匹配符合的情况下,会进入这一配置中,实际上相当于缺省配置。

以下备忘 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,依次尝试:

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

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

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

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

匹配顺序

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

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

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

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

如果第 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 命令」。


参考

查看 SELinux 状态及关闭 SELinux

Chcon 命令

Nginx error_log 错误日志级别

Nginx -- mime.types

HTTP Content-Type

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

nginx location 匹配规则

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

怎样正确设置 remote_addr 和 x_forwarded_for - CSDN

Nginx 内置预定义变量

fastcgi_param 详解 - CSDN

NGINX:Web 服务器 - 宁皓网

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39531.html

相关文章

  • Nginx 支持单域名多 Vue 服务配置备忘

    摘要:最近开发时,遇到需要使用同一域名承载多个前端项目的场景,具体需求如下访问新版本前端项目访问后端接口服务访问默认前端项目配置内容注意的配置。此时,可以通过对新版前端文件中的进行配置,以规避这一问题注该方法仅适用于构建的项目参考链接 最近开发时,遇到需要使用同一域名承载多个前端项目的场景,具体需求如下: /v2 访问新版本前端项目 /api 访问后端 Spring Boot 接口服...

    zhichangterry 评论0 收藏0
  • Linode(Ubuntu 14.04 LTS)安装Wordpress备忘

    摘要:主机选择登录主机操作系统升级操作系统升级软件升级删除升级包设置主机时区设置主机名更新主机名绑定域名创建新的主机用户安装至此可以尝试打开下网站看看配置修改为主机登录用户名进程数增加设置上传文件大小检测配置信息 主机选择 Ubuntu 14.04 LTS 登录主机 ssh root@xx.xx.xx.xx 操作系统升级 apt-get update 操作系统升级apt-get upgrad...

    chinafgj 评论0 收藏0
  • Linode(Ubuntu 14.04 LTS)安装Wordpress备忘

    摘要:主机选择登录主机操作系统升级操作系统升级软件升级删除升级包设置主机时区设置主机名更新主机名绑定域名创建新的主机用户安装至此可以尝试打开下网站看看配置修改为主机登录用户名进程数增加设置上传文件大小检测配置信息 主机选择 Ubuntu 14.04 LTS 登录主机 ssh root@xx.xx.xx.xx 操作系统升级 apt-get update 操作系统升级apt-get upgrad...

    everfly 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<