nginx的配置与使用

这篇文章限于window下对nginx配置与应用

在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍

1.启动

start nginx

如果需要特殊设置nginx的配置文件路径,可以这样执行start nginx -c conf/nginx.conf

2.停止

nginx -s stop

3.重新载入Nginx

nginx -s reload

4.nginx的日志,一般有两个文件 logs/access.log 和 logs/error.log

5.root和alias的区别

在Nginx配置文件中,rootalias 指令有着不同的用途和行为。它们主要用于指定静态文件和服务的根目录位置

(1)root的配置

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

当用户访问 http://example.com/index.html 时,Nginx会在 /var/www/html/index.html 寻找文件

如果将 location / 修改 location /v,即按照如下的配置,需要路径的访问会发生本质的变化

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

当用户访问 http://example.com/v/picture.jpg 时,Nginx 会进行如下操作,根据 location /v/ 块中的 root /var/www/html; 指令,Nginx 将会去 /var/www/html/v/picture.jpg 这个路径下寻找文件

(2)alias的配置

server {
    listen       80;
    server_name  example.com;

    root /var/www/html;
    location /v/ {
        alias /usr/share/nginx/images/;
    }
}

在这个配置示例中,当用户访问 http://example.com/v/picture.jpg 时,Nginx 将会去 /usr/share/nginx/images/picture.jpg 路径下寻找文件。这是因为您在 location /v/ 块中使用了 alias 指令来指定 /usr/share/nginx/images/ 作为根目录

关键区别

  • 路径解析:

    • root: 当你使用 root 指令时,Nginx会将请求的URI与root路径拼接起来寻找文件。
    • alias: 当你使用 alias 指令时,Nginx会将请求的URI直接匹配到文件系统中的路径。

6.location常见配置

(1)匹配规则

类型 含义 匹配方式 优先级 样式
=/路径 精确匹配 前缀 1 location =/image {}
^~ 优先匹配 前缀 2 location ^~ /page {}
~ 普通正则-大小写敏感 正则符号 3 location ~ .(jpe?g)$ {}
~* 普通正则-大小写不敏感 正则符号 3 location ~* .(jpe?g)$ {}
空 / 通用匹配 前缀 4 location / {}
空 <路径> 前缀匹配 前缀 * location /index {}

(2)匹配优先级

优先级: 精确匹配 > location 完整路径 > 优先匹配 > 正则匹配 >location 部分路径 > 通用匹配

(3)匹配示例

location =/ {} # 精确规则

location =/login {} # 精确规则

location ^~ /static/ {} # 优先匹配

location ~ \.(gif|jpg|png|js|css)$ {} # 正则规则

location ~* \.png$ {} # 正则规则

location / {} # 通过规则

7.location临时跳转

在 Nginx 中,return 指令可以用来发送一个 HTTP 重定向响应给客户端。如果您想使用 location 块来执行一个 302 临时重定向,可以使用 return 指令配合适当的 HTTP 状态码。

假设您希望所有访问 /oldpath 的请求都被重定向到 /newpath,并且使用 302 临时重定向,可以在 location 块中使用 return 如下

server {
    listen       80;
    server_name  example.com;

    location /oldpath {
        return 302 /newpath;
    }

    location /newpath {
        # 处理新路径的逻辑
    }
}

在这个例子中,当用户访问 http://example.com/oldpath 时,Nginx 将发送一个 302 重定向响应,告诉浏览器跳转到 http://example.com/newpath

详细说明

  1. return 指令:

    • return 指令用于立即终止处理请求,并发送一个固定的响应。
    • 在上面的例子中,return 302 /newpath; 表示返回一个 302 重定向,并将新的 URL 设置为 /newpath
  2. HTTP 状态码:

    • 302 表示“临时重定向”,表示请求的资源已经被临时移动到了另一个位置。
    • 其他可用的状态码包括 301(永久重定向)、303(查看其他)、307(临时重定向,保持请求方法不变)等。
  3. 重定向路径:

    • 重定向的目标路径可以是绝对路径(例如,http://example.com/newpath),也可以是相对路径(例如,/newpath)。
    • 如果使用相对路径,Nginx 会基于原始请求的 URL 来构建重定向后的 URL。

使用 302 重定向不会被大多数浏览器缓存,除非显式设置了缓存控制头

8.反向代理

Nginx 作为一款高性能的 Web 服务器和反向代理服务器,可以非常有效地实现反向代理功能。反向代理是一种网络架构模式,在这种模式中,客户端并不直接连接到最终的服务端,而是通过一个中间层(即反向代理服务器)来转发请求和响应

假设您有以下 Nginx 配置,它将所有以 /api 开头的请求转发到 http://backend.example.com

server {
    listen       80;
    server_name  example.com;

    location /api {
        proxy_pass http://backend.example.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

注意事项

  • 路径处理:

    • proxy_pass 指令中的 URL 不包含路径部分,Nginx 会将请求的路径附加到目标 URL 上。例如,如果请求 URL 是 http://example.com/api/users/123,则实际转发的 URL 将是 http://backend.example.com/api/users/123
  • 请求头传递:

    • 使用 proxy_set_header 指令来传递必要的请求头,例如 HostX-Real-IPX-Forwarded-For 和 X-Forwarded-Proto,这对于确保后端服务器能够正确识别客户端信息非常重要。
  • 性能优化:

    • 考虑使用 proxy_cache 指令来缓存响应,减轻后端服务器的负担。
    • 使用 proxy_read_timeout 和 proxy_send_timeout 来调整超时设置。
  • 安全性:

    • 如果后端服务器支持 HTTPS,考虑使用 https:// 来加密数据传输。
    • 使用 proxy_set_header 来传递客户端的原始信息,例如 IP 地址和请求协议。
  • 负载均衡:

    • 使用 upstream 指令来定义一组后端服务器,并在 proxy_pass 中引用它们来进行负载均衡。
  • 故障转移:

    • 可以配置多个后端服务器,并在其中一个不可用时自动切换到另一个。

为了优化上述 Nginx 配置,我们可以添加一些额外的功能,如缓存、安全性和性能方面的改进。下面是一个经过优化的示例配置,包括了缓存、安全性以及性能优化等方面的内容:

server {
    listen       80;
    server_name  example.com;

    # 缓存相关设置
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_valid 200 60m;
    proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

    # SSL 相关设置
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # HTTP/2 支持
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    # 日志格式
    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;

    # 错误日志
    error_log /var/log/nginx/error.log;

    # 主页静态文件
    root /var/www/html;

    # 默认首页
    index index.html;

    # 处理 API 请求
    location /api {
        proxy_pass http://backend.example.com;

        # 设置代理头
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 安全性
        proxy_ssl_server_name on;
        proxy_ssl_session_reuse on;
        proxy_ssl_session_cache shared:SSL:10m;
        proxy_ssl_session_tickets off;

        # 性能
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # 缓存设置
        proxy_cache my_cache;
        proxy_cache_bypass $http_pragma;
        proxy_cache_lock on;
        proxy_cache_min_uses 2;
        proxy_cache_revalidate on;
        proxy_cache_background_update on;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_methods GET HEAD;

        # 缓存状态页面
        add_header X-Cache-Status $upstream_cache_status;
    }

    # 其他 location 块,例如处理静态文件
    location / {
        try_files $uri $uri/ =404;
    }
}

解释配置中的主要更改点:

  1. 缓存:

    • proxy_cache_path: 定义缓存存储的位置。
    • proxy_cache_key: 定义用于区分缓存条目的键。
    • proxy_cache_valid: 定义缓存的有效时间。
    • proxy_cache_use_stale: 在后端服务器出现问题时使用陈旧的缓存数据。
  2. 安全性:

    • SSL/TLS 设置: 配置 SSL 证书和密钥,启用 HTTPS。
    • proxy_ssl_server_name: 允许使用 SNI。
    • proxy_ssl_session_reuse: 重用 SSL 会话以提高性能。
    • proxy_ssl_session_cache: SSL 会话缓存设置。
    • proxy_ssl_session_tickets: 禁用 SSL 会话票证,增加安全性。
  3. 性能:

    • proxy_buffer_size: 代理缓冲区的大小。
    • proxy_buffers: 缓冲区的数量和大小。
    • proxy_busy_buffers_size: 忙时缓冲区的大小。
    • proxy_temp_file_write_size: 写入临时文件的大小阈值。
    • proxy_connect_timeout: 连接后端服务器的超时时间。
    • proxy_send_timeout: 发送数据到后端服务器的超时时间。
    • proxy_read_timeout: 读取后端服务器数据的超时时间。
  4. 日志管理:

    • log_format: 自定义日志格式。
    • access_log: 访问日志文件位置。
    • error_log: 错误日志文件位置。
  5. 其他:

    • HTTP/2 支持: 启用 HTTP/2 提高性能。
    • add_header X-Cache-Status: 添加响应头以显示缓存状态。
posted @ 2024-08-27 16:00  子墨老师  阅读(20)  评论(0编辑  收藏  举报