内容纲要

🗂 | 本文目录: NGINX 指南


接上一篇 NGINX | 配置文件nginx.conf 文件是 NGINX 服务使用的默认配置入口。这个配置文件为诸如 worker 进程、调优、日志、加载动态模块以及对其他 NGINX 配置文件的引用等设置了全局设置。

为了有助于维护以及保持配置文件的简洁,不应该直接将站点的配置直接写入在主配置文件 nginx.conf 中。

所以如果你是通过 APT 或 DNF/YUM 这样的高级软件包管理系统所安装的 NGINX,就将单个站点配置文件写入到目录 /etc/nginx/conf.d/,而如果是通过编译安装的 NGINX:

# 创建一个用于放置各个独立站点的 NGINX 配置目录
$ sudo mkdir /usr/local/etc/nginx

# 修改主配置文件
$ sudo vim /usr/local/nginx/conf/nginx.conf

下面是一个完整的配置示例,你的默认主配置文件可能和我的不太一样,不用改成和下面的示例完全相同,重点在于第 32 行:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /usr/local/etc/nginx/*.conf;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   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   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;
        #}
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

在 32 行的位置( http {} 里面)加入了一条:

include /usr/local/etc/nginx/*.conf;

这表示包括 /usr/local/etc/nginx/ 目录下,以 .conf 结尾的配置文件(设置只有 .conf 结尾的生效时,当你备份某个配置文件时可以使用 cp 命令在当前目录复制出一个如以 .conf.bak 结尾的配置备份文件),然后我们就可以专注于在 /usr/local/etc/nginx/ 写各个站点的配置文件。

接着重载 NGINX 以让该配置生效:

$ sudo nginx -s reload
# 或使用 NGINX
$ sudo systemctl reload nginx

如遇到 nginx: command not foundnginx.service: Unit not found. 可以查看之前的文章 NGINX | 使用编译安装(源码构建) 以了解如何解决。

搭建简易的静态内容服务器

Web 服务器的一项重要任务是提供文件(如图像或静态 HTML 页面)。

新建一个名为 static-content.conf 的配置文件,表示这是一个静态内容站点,这样做可比把所有站点配置都写在主配置文件 nginx.conf 要好管理:

# 如果是通过编译安装的 NGINX:
$ sudo vim /usr/local/etc/nginx/static-content.conf

# 如果你是通过 APT 或 DNF 安装的 NGINX:
$ sudo vim /etc/nginx/conf.d/static-content.conf
server {
    listen 80 default_server;
    server_name www.example.com;
    location / {
        root /usr/share/nginx/html;
        # alias /usr/share/nginx/html;
        index index.html index.htm;
    }
}

这个配置的第一行定义了一个新的服务器块(由花括号包裹着)。

  • listen:监听端口(可使用范围);
  • default_server:默认服务器;
  • server_name:域名;
  • location:根据 URL 中的路径定义一个配置;
  • root:部署文件路径;
  • index:默认文件;

在上述例子中,配置由 /usr/share/nginx/html/ 目录并通过 HTTP 的 80 端口提供静态文件。

server_name 为绑定的域名,此处为示例的 www.example.com

default_server 表示指示 NGINX 使用这个服务器作为 80 端口的默认服务器。NGINX 将只在 HTTP 主机头与提供给 server_name 的值相匹配的情况下把请求指向这个服务器。

在 URL 后的部分别称为「被称为统一资源识别符(URI)」,此处的 location 使用 / 来匹配所有的请求。根(/)指令显示 NGINX 在为给定上下文提供内容时查找静态文件的位置。在查找所请求的文件时,请求的 URI 附加到根指令的值。如果为 location 指令提供了 URI 前缀,那么这将包含在附加路径中,除非使用 alias 指令而不是 root 指令。location 指令能够匹配大范围的表达式。关于这部分你可以查阅 NGINX HTTP Location Directive Documentation 以了解更多信息。

在配置完成后,需要重新加载 NGINX 配置以使配置文件生效:

$ sudo nginx -s reload
# 或使用 systemd
$ sudo systemctl reload nginx

在这个例子中,因为有了 default_server 所以除了可以使用 www.example.com 访问该服务器,也可以使用 IP 直接访问。

⚠️ 注意:你并不能直接访问 www.example.com 因为此处只是假设,但你可以通过在系统的 hosts 文件中指定 www.example.com 指向你所搭建的 NGINX 服务器的 IP 上,你也许是通过虚拟机、局域网的某台服务器或云服务器在测试搭建 NGINX,指向它的 IP 即可(云服务器要有公网 IP)。

如果 NGINX 部署在本机上可以使用浏览器访问 IP 127.0.0.1localhost,如果在其他地方(虚拟机、局域网中的某台机器或云服务器)输入它的 IP 即可看到效果,当然你的 /usr/share/nginx/html 下要有文件如 index.html 否则就只能看到 HTTP 403 了。

autoindex:目录浏览和索引

这里要提到个很实用的功能,使用选项 autoindex on; 可以开启目录浏览和索引功能

server {
      # IPv4 监听端口
      listen 80;
      # IPv6 监听端口
      listen [::]:80;

      # 绑定域名
      server_name example.com;

      # 部署文件的目录
      root /usr/share/nginx/html;
      index index.html;

      location / {
              # 当文件不存在时返回 404
              try_files $uri $uri/ =404;
      }

      location /down {
              # 开启目录浏览及索引功能
              autoindex on;

              # 默认为 on,显示单位为 bytes。设为 off 后单位显示显示常用单位如 K M G
              # autoindex_exact_size off;

              # 默认为 off,显示的文件时间为 GMT 时间。设为 on 后显示的文件时间为文件的服务器时间
              # autoindex_localtime on;
      }
}

在上述示例中,网站根目录下的 down 目录(不能有 index.html文件)开启了 autoindex on;,假设该服务器地址为 192.168.1.2,那么当访问 URI 为 http://192.168.1.2/down/ 时,这个目录下的内容会以类似于操作系统上使用文件管理器时的列表形式展示。

另外还有 autoindex_exact_sizeautoindex_localtime 两个功能默认注释了,去掉井号就可以将其开启,自己动手试试吧。