nginx 基本设置
blog
本文字数:2.2k 字 | 阅读时长 ≈ 8 min

nginx 基本设置

blog
本文字数:2.2k 字 | 阅读时长 ≈ 8 min

更多 nginx 使用参考nginx 使用总结

1. nginx 安装

安装参考nginx 安装,下面是 nginx 的一些基本命令

sudo apt-get --purge remove nginx # 卸载
sudo apt install nginx # 安装
sudo systemctl status nginx # 验证是否被成功安装
service nginx start  # 启动
systemctl restart nginx  # 重启

2. nginx 基本配置

nginx 的主要配置文件是 /etc/nginx/nginx.conf,它由多个部分组成,包括 全局块、events 块、http 块等。http 块中又可以包含多个 server 块,用于配置不同的虚拟主机,基本配置文件如下所示

|- 全局块
|- events块
|- Http全局块
    |- Server全局块
        |- location块
        |- location块
        |- ...
    |- Server全局块
        |- location块
        |- location块
        |- ...
    |- ...
  1. 全局块
    全局块包含:全局指令,对整个 nginx 服务器的行为进行全局设置,它通常位于配置文件的开头。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
  1. events 块
    Events 块用于配置与 nginx 工作进程相关的参数,主要控制 nginx 如何处理连接。
events {
    worker_connections 1024;
    multi_accept on;
}
  1. HTTP 块
    HTTP 块是 nginx 配置文件的核心部分,用于配置 HTTP 服务和相关的 HTTP 请求处理,http 块里面都有一个 server 部分,但是下面例子没有展示,这是因为已经从别的文件 include 进来了: include /etc/nginx/sites-enabled/*;,就是说在 /etc/nginx/sites-enabled 里面是有 .conf 文件的,里面就是 server 模块,参考后面的网页例子即可
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

3. server块详解

在实践过程中,我们最常用的是http中的server模块

3.1 server.root

root指令用于定义服务器的根目录,也就是文件系统中的一个绝对路径。当nginx接收到一个请求时,它会将请求的URI添加到root指令指定的路径后面,然后在这个路径下查找并返回文件。如下例子:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/example;
    }
}

在这个例子中,如果nginx接收到一个请求,请求的URI是/images/logo.png,那么nginx会在/var/www/example/images/logo.png这个路径下查找文件

root的作用范围和优先级

在nginx配置中,root指令可以在serverlocation块中使用

  1. 作用范围: 在server块或location块中使用root指令,只会影响到对应位置的请求(匹配到哪一部分就影响哪一部分,下面会举例)
  2. 优先级: 如果serverlocation块中都定义了root指令,那么location块会覆盖server块中的root指令。即location的优先级更高

例如,假设我们有以下的配置:

server {
    listen 80;
    server_name example.com;
    root /var/www/example;

    location /images/ {
        root /var/www/example/static;
    }
}

在这个例子中,如果请求的URI是/index.html,那么nginx会在/var/www/example/index.html这个路径下查找文件,因为这个请求没有匹配到任何location,所以使用了server块中的root指令。如果请求的URI是/images/logo.png,那么nginx会在/var/www/example/static/images/logo.png这个路径下查找文件,因为这个请求匹配到了/images/这个location规则,所以使用了location块中的root指令,覆盖了server块中的root指令

3.2 server.index

index指令用于定义目录的默认索引文件。当请求的URI是一个目录时,nginx会尝试在该目录下查找并返回index指令指定的文件。如果找到了这个文件,nginx会将其作为响应返回给客户端。如果没有找到这个文件,nginx会继续处理请求,可能返回一个目录列表(如果配置了autoindex指令)或者返回一个错误(例如404 Not Found)

可以指定多个index文件名,nginx会按照顺序查找这些文件,直到找到第一个存在的文件为止,如下,我们为index指令指定了三个文件名:index.htmlindex.htmindex.php。当请求的URI是一个目录时,nginx会按照顺序在该目录下查找这些文件

server {
    listen 80;
    server_name www.example.com;
    root /var/www/example;

    index index.html index.htm index.php;
}

如果请求的URI是/,那么nginx会依次查找/var/www/example/index.html/var/www/example/index.htm/var/www/example/index.php。如果找到了其中一个文件,就将其作为响应返回给客户端

index查找顺序

如果location块中没有指定index指令,nginx会沿着location server http的顺序来查找index指令,如果都没有,则nginx会使用默认值,即index index.html。也就是说当请求的URI是一个目录时,nginx会尝试在该目录下查找名为index.html的文件,并将其作为响应返回给客户端

3.3 server.alias

alias指令用于为特定的URI定义一个不同的文件系统路径。与root指令不同,alias指令不会将请求的URI添加到文件系统路径后面。alias指令主要用于location块中,以便为特定的URI设置一个独立的文件系统路径。如下例子,我们为/static/这个URI定义了一个别名路径/var/www/example/assets/。当请求的URI以/static/开头时,nginx会将URI中的/static/替换为/var/www/example/assets/,然后在这个路径下查找文件。例如,如果请求的URI是/static/css/style.css,那么nginx会在/var/www/example/assets/css/style.css这个路径下查找文件。

server {
    listen 80;
    server_name example.com;
    root /var/www/example;

    location /static/ {
        alias /var/www/example/assets/;
    }
}

注意: alias指令的路径应该与location指令的URI匹配。在上面的例子中,location指令的URI是/static/alias指令的路径是/var/www/example/assets/。这两个路径的最后一个斜杠是对齐的,这样nginx才能正确地替换URI并找到文件。如果alias指令的路径不包含最后一个斜杠,例如/var/www/example/assets,那么nginx会将请求的URI与这个路径连接,可能导致错误的文件路径。

3.4 server.try_files

try_files指令用于按顺序检查文件或目录的存在,并返回第一个找到的文件或目录。如果所有的文件或目录都没有找到,try_files指令可以将请求重定向到一个新的URI

server {
    listen 80;
    server_name www.example.com;
    root /var/www/example;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

上面例子,nginx 接收到一个请求,它会按照以下的顺序查找文件或目录:

  1. 首先,Nginx 会查找与请求的 URI 完全匹配的文件。如果找到了这个文件,nginx 会将其作为响应返回给客户端
  2. 如果没有找到匹配的文件,nginx 会查找与请求的 URI 匹配的目录。如果找到了这个目录,nginx 会使用 index 指令指定的索引文件作为响应
  3. 如果没有找到匹配的文件或目录,nginx 会将请求重定向到 /index.html 这个 URI,并重新开始处理请求

try_files 指令非常灵活,可以根据需要指定任意数量的文件、目录或 URI

4. 添加 http 和 https 静态网站的例子

虚拟主机允许我们在同一台服务器上运行多个网站。以下是一个简单的虚拟主机配置示例:
我们为同一个域名 example.com 配置了 HTTPHTTPS 两个服务器。HTTP 服务器监听 80 端口,HTTPS 服务器监听 443 端口。

注意,为了启用 SSL,我们在 listen 指令中添加了 ssl 参数,并使用 ssl_certificatessl_certificate_key 指令指定了证书和私钥的路径。配置完成后,需要重启 nginx 服务以使新的配置生效。

http {
    # HTTP server
    server {
        listen 80;
        server_name example.com;
        location / {
            root /var/www/example;
        }
    }

    # HTTPS server
    server {
        listen 443 ssl;
        server_name example.com;

        ssl_certificate /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;

        location / {
            root /var/www/example;
        }
    }
}