Nginx练习

Nginx实战笔试题详细解答

题目1:配置Nginx实现简单的轮询负载均衡

要求:
配置Nginx以轮询方式将请求负载均衡到两台后端服务器:192.168.1.100:8080和192.168.1.101:8080。此外,配置一台备用服务器192.168.1.102:8080,在主服务器故障时进行故障转移。设置连接超时时间为5秒,读取和发送超时时间为10秒。

配置方法

http {
    upstream backend_servers {
        server 192.168.1.100:8080;
        server 192.168.1.101:8080;
        server 192.168.1.102:8080 backup;
        keepalive 8;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend_servers;
            proxy_connect_timeout 5s;
            proxy_read_timeout 10s;
            proxy_send_timeout 10s;
        }
    }
}
keepalive 8 :Nginx 会为每个后端服务器维护 8 条空闲的长连接,以便后续请求可以复用这些连接,而不需要重新建立连接。

使用场景

适用于需要将流量平均分配到多个后端服务器的场景,当主服务器故障时自动切换到备用服务器。


题目2:配置Nginx作为反向代理

要求:
配置Nginx将所有对/api路径的请求反向代理到后端服务器192.168.1.110:8000。同时,设置代理请求头,并配置错误页面,当后端服务器出现500、502、503、504错误时,返回自定义的error.html页面。

配置方法

server {
    listen 80;

    location /api {
        proxy_pass http://192.168.1.110:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        error_page 500 502 503 504 /error.html;
        proxy_intercept_errors on;
    }

    location /error.html {
        root /path/to/error/pages;
        internal;
    }
}
proxy_set_header X-Real-IP $remote_addr;
将客户端的真实 IP 地址传递给后端服务器,因为反向代理会隐藏客户端的 IP,使用此指令可以确保后端服务器知道请求的实际来源 IP。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
将客户端的 IP 地址附加到 X-Forwarded-For 请求头中,用于追踪请求的原始来源,如果请求经过多个代理,X-Forwarded-For 可以包含多个 IP 地址。

500(内部服务器错误)、502(坏网关)、503(服务不可用)、504(网关超时)

internal;
该指令表示这个位置只能由内部请求访问,即只能由 Nginx 本身在处理请求时访问,不能通过外部直接请求/error.html,以防止用户直接访问错误页面。

使用场景

适用于需要隐藏后端服务器信息并提供统一入口的API服务场景。


题目3:配置Nginx对静态文件进行缓存

要求:
配置Nginx对静态文件(如jpg、jpeg、png、gif、ico、css、js)进行缓存,缓存路径为/data/cache,缓存有效期为1天。同时,配置浏览器缓存选项,包括Last-ModifiedETag头部信息。

配置方法

http {
    proxy_cache_path /data/cache levels=1:2 keys_zone=STATIC_CACHE:10m max_size=1g inactive=1d use_temp_path=off;

    server {
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            proxy_pass http://backend;
            proxy_cache STATIC_CACHE;
            proxy_cache_valid 200 1d;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_revalidate on;
            proxy_cache_lock on;

            add_header Last-Modified $upstream_last_modified;
            add_header ETag $upstream_etag;
        }
    }
}

配置解释

  1. proxy_cache_path 指令
    • 定义了缓存文件的存储路径和相关参数。
    • /data/cache:缓存文件存储的路径。
    • levels=1:2:缓存文件的目录结构级别,这里是一级目录和二级目录。
    • keys_zone=STATIC_CACHE:10m:定义了一个共享内存区域,用于存储缓存键和元数据,名称为 STATIC_CACHE,大小为 10MB。
    • max_size=1g:设置缓存的最大磁盘空间大小为 1GB。
    • inactive=1d:缓存文件在没有被访问的情况下,1 天后会被自动清理。
    • use_temp_path=off:禁用临时文件路径,直接将缓存文件存储在指定的缓存路径下。
  2. proxy_cache STATIC_CACHE;
    • 指定使用 STATIC_CACHE 缓存区域。
  3. proxy_cache_valid 200 1d;
    • 设置对状态码为 200(成功)的响应的缓存有效期为 1 天。
  4. proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    • 在以下情况下使用过期缓存:
      • 出现错误(error)。
      • 连接超时(timeout)。
      • 正在更新缓存(updating)。
      • 后端服务器返回 500(内部服务器错误)、502(坏网关)、503(服务不可用)或 504(网关超时)错误。
  5. proxy_cache_revalidate on;
    • 开启缓存过期验证。Nginx 会在缓存到期时向后端服务器发送验证请求,以检查资源是否已更改。
  6. proxy_cache_lock on; * 开启缓存锁。当多个请求同时请求相同的资源时,只有一个请求会去获取后端服务器的资源,其余请求会等待缓存更新完成。
  7. add_header Last-Modified $upstream_last_modified; * 将后端服务器响应中的 Last-Modified 头信息添加到响应中。
  8. add_header ETag $upstream_etag; * 将后端服务器响应中的 ETag 头信息添加到响应中。

使用场景

适用于需要加速静态资源访问的高流量网站。


题目4:配置Nginx增强安全性

要求:
配置Nginx以增强安全性,包括:

  • 禁止目录浏览。
  • 限制对.html.php文件的访问权限,只允许来自192.168.1.0/24网段的访问。
  • 配置HTTP安全头部,包括X-Content-Type-OptionsX-Frame-OptionsX-XSS-ProtectionStrict-Transport-SecurityReferrer-Policy
  • 配置防盗链,仅允许来自example.com及其子域的referer请求访问/images/目录下的文件。

配置方法

server {
    listen 80;
    root /var/www/html;

    # 禁止目录浏览
    autoindex off;

    # 限制文件访问权限
    location ~* \.(html|php)$ {
        allow 192.168.1.0/24;
        deny all;
    }

    # 配置HTTP安全头部
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header Referrer-Policy "same-origin" always;

    # 配置防盗链
    location /images/ {
        valid_referers none blocked example.com *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}
X-Content-Type-Options: nosniff 告诉浏览器不要对 MIME 类型进行猜测,这可以防止攻击者上传恶意文件并试图让浏览器以不安全的方式解析它。
X-Frame-Options: SAMEORIGIN 指定页面只能在相同来源的页面中被嵌入到 <frame>、<iframe>、<embed> 或 <object> 中,防止点击劫持攻击。
X-XSS-Protection: 1; mode=block 启用浏览器的 XSS 过滤功能,如果检测到反射型 XSS 攻击,浏览器将阻止页面渲染。
Strict-Transport-Security: max-age=31536000; includeSubDomains 让浏览器在指定的时间(这里是 1 年)内只通过 HTTPS 访问网站,提高安全性。
Referrer-Policy: same-origin 控制 HTTP Referer 头部信息,只在相同来源的页面之间共享引用信息,防止敏感信息泄露。

valid_referers: 指定哪些引用来源是允许的。这里的 none 表示没有引用来源的直接访问是允许的;blocked 表示来自被阻止的引用来源的访问是不允许的;example.com 和 *.example.com 表示来自 example.com 及其子域的引用是允许的。

题目5:配置Nginx作为负载均衡器

要求:
配置Nginx作为负载均衡器,将流量分发到两台后端服务器:192.168.1.110:8000和192.168.1.111:8000。使用轮询(round-robin)策略,并配置健康检查,确保只有健康的服务器接收请求。

配置方法

http {
    upstream backend {
        server 192.168.1.110:8000;
        server 192.168.1.111:8000;
        check interval=3000 rise=2 fall=5;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
interval=3000:每隔 3000 毫秒(3 秒)检查一次后端服务器的健康状态。
rise=2:连续两次检查成功后,认为服务器可用。
fall=5:连续五次检查失败后,认为服务器不可用。

题目6:配置Nginx处理动静分离

要求:
配置Nginx处理动静分离,将静态文件(如图片、CSS、JavaScript)直接由Nginx服务,动态请求(如PHP)反向代理到后端应用服务器192.168.1.120:8080。同时,配置静态文件的缓存策略,缓存有效期为7天。

配置方法

server {
    listen 80;
    root /var/www/html;

    # 静态文件配置
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 7d;
        access_log off;
    }

    # 动态请求配置
    location / {
        proxy_pass http://192.168.1.120:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
expires 7d;:设置静态文件的缓存过期时间为 7 天。
access_log off;:关闭对静态文件的访问日志记录,减少日志文件的大小和磁盘 I/O。

题目7:配置Nginx进行URL重写

要求:
配置Nginx进行URL重写,将/old-page重定向到/new-page,并将所有对/downloads目录的请求重写到/files目录。

配置方法

server {
    listen 80;

    # 永久重定向
    rewrite ^/old-page$ /new-page permanent;

    # 内部重写
    location /downloads/ {
        rewrite ^/downloads/(.*)$ /files/$1 break;
    }
}
permanent:表示 HTTP 状态码为 301(永久重定向),告诉客户端该资源已永久移动到新位置。
特性 重定向(Redirect) 内部重写(Internal Rewrite)
客户端感知 客户端收到重定向响应,浏览器自动跳转 客户端不会感知到路径的变化
用途 用于网站迁移、页面结构调整等 用于隐藏实际路径、优化 URL 结构
HTTP 状态码 301(永久重定向)或 302(临时重定向) 无(内部处理,不返回重定向状态码)
SEO 影响 301 永久重定向有助于 SEO 内部重写对 SEO 没有直接影响
示例 rewrite ^/old-page$ /new-page permanent; rewrite ^/downloads/(.*)$ /files/$1 break;
典型使用场景 网站迁移、页面结构调整 隐藏实际路径、优化 URL 结构

使用场景

适用于网站内容迁移或URL结构调整的场景。


题目8:配置Nginx的日志格式和访问日志

要求:
配置Nginx使用自定义的日志格式,包括请求时间、客户端IP、请求方法、请求URI、状态码、响应大小和用户代理。并将访问日志记录到/var/log/nginx/access.log

配置方法

http {
    log_format custom_log '$time_local $remote_addr "$request_method $request_uri $server_protocol" '
                          '$status $body_bytes_sent "$http_referer" "$http_user_agent"';

    server {
        access_log /var/log/nginx/access.log custom_log;
    }
}

题目9:配置Nginx处理WebSocket连接

要求:
配置Nginx处理WebSocket连接,将/websocket路径的请求反向代理到后端WebSocket服务器192.168.1.130:8080,并配置相应的头部信息。

配置方法

# Nginx WebSocket 代理配置详解

## 配置解析
```nginx
server {
    listen 80;  # 监听80端口(HTTP)

    location /websocket {
        proxy_pass http://192.168.1.130:8080;  # 转发到后端服务器
        proxy_http_version 1.1;  # 使用HTTP/1.1协议
        proxy_set_header Upgrade $http_upgrade;  # 传递Upgrade头
        proxy_set_header Connection "Upgrade";  # 设置Connection头
        proxy_set_header Host $host;  # 传递原始Host头
    }
}
graph LR
A[客户端] -->|1. 发送Upgrade请求| B(Nginx)
B -->|2. 转发升级头| C[后端服务器]
C -->|3. 返回101状态码| B
B -->|4. 建立WebSocket隧道| A

使用场景

适用于需要实时双向通信的应用,如聊天系统或实时仪表盘。

预期输出

WebSocket连接将被正确代理,保持长连接状态。


题目10:配置Nginx进行限速

要求:
配置Nginx对/download目录的请求进行限速,限制每个IP的下载速度为100KB/s。

配置方法

# Nginx 限速与连接限制配置详解

## 配置解析
```nginx
http {
    # 创建名为"one"的连接限制区,使用客户端IP作为键,分配10MB内存
    limit_zone one $binary_remote_addr 10m;	#客户端IP的二进制形式(节省空间)

    server {
        # 匹配/download路径下的所有请求
        location /download {
            # 限制传输速度为100KB/s
            limit_rate 100k;
            
            # 限制每个客户端IP只能有1个并发连接
            limit_conn one 1;
        }
    }
}

题目11:配置Nginx进行多域名虚拟主机

要求:
配置Nginx同时托管两个域名example.comexample.org,每个域名对应不同的根目录。

配置方法

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

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

题目12:配置Nginx进行Gzip压缩

要求:
配置Nginx对响应内容进行Gzip压缩,提高传输效率。

配置方法

http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 256;
    gzip_comp_level 5;
}
gzip_min_length 256;:设置响应内容的最小长度,只有当响应内容大于或等于 256 字节时才进行压缩。
gzip_comp_level 5;:设置压缩级别,范围从 1 到 9。1 表示压缩速度最快但压缩率最低,9 表示压缩速度最慢但压缩率最高。5 是一个平衡了速度和压缩率的默认值。

题目13:配置Nginx进行流量监控

要求:
配置Nginx使用ngx_http_stub_status_module模块进行流量监控,允许访问/nginx_status页面查看状态。

配置方法

server {
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

使用场景

适用于需要监控Nginx性能和流量状态的运维场景。

访问/nginx_status将显示Nginx的运行状态信息,包括连接数、请求处理情况等。


题目14:配置Nginx进行缓存控制

要求:
配置Nginx对静态资源进行缓存控制,缓存有效期为1小时,并允许客户端缓存。

配置方法

server {
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1h;
        add_header Cache-Control "public, max-age=3600";
    }
}
expires 1h;:设置响应头 Expires 为 1 小时后。客户端会在本地缓存资源,直到指定时间。
add_header Cache-Control "public, max-age=3600";:添加 Cache-Control 响应头,设置缓存控制策略。
public:表示响应可以被任何缓存存储(包括公共缓存,如 CDN)。
max-age=3600:表示资源可以在客户端缓存中存储 3600 秒(1 小时)。

使用场景

静态资源的缓存有效期设置为1小时,响应头包含缓存控制信息。

posted @ 2025-05-30 00:02  FangNing  阅读(50)  评论(0)    收藏  举报