Published on

Nginx作用和配置案例

标签:nginx

Nginx 是什么?

Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。它以高并发、低资源消耗和稳定著称,广泛用于 Web 服务器、负载均衡和反向代理等场景。

作用

  • 静态资源服务器:可以用来直接提供 HTML、CSS、JS、图片等静态资源。
  • 反向代理服务器:Nginx 可以作为前端服务器,将用户请求转发到后端的应用服务器,比如 Node.js、PHP 等。
  • 负载均衡:Nginx 可以将请求分发到多个后端服务器,实现负载均衡。
  • SSL/TLS 加密:Nginx 支持 HTTPS 加密通信,通过 SSL/TLS 提供安全的连接。
  • 缓存加速:可以通过设置缓存,提升静态资源的加载速度。
  • 日志记录:可以记录访问日志和错误日志,帮助监控和分析服务器的运行状态。
  • 虚拟主机:支持虚拟主机配置,可以在同一台服务器上托管多个域名的网站。

常见配置属性

  • server:配置一个虚拟主机,每个 server 指定一个域名或 IP 地址的配置。
  • location:用于匹配请求路径,决定处理请求的方式。
  • listen:指定 Nginx 监听的端口,默认是 80 端口。
  • proxy_pass:指定反向代理的后端地址,将请求转发到该地址。
  • root:指定静态文件的根目录路径。
  • index:配置默认访问的主页文件,如 index.html
  • error_page:定义自定义的错误页面。
  • gzip:启用 gzip 压缩,减少文件体积,提高传输效率。
  • client_max_body_size:设置客户端请求体的最大值,常用于限制上传文件大小。

配置案例

前后端分离项目通常会将前端的静态资源托管在 Nginx 上,而后端服务通过 Nginx 进行反向代理。假设你的前端构建后的文件在 /usr/local/front/myPortal/dist 目录,后端服务是基于 Node.js,运行在 http://localhost:3000

配置文件示例

# Nginx 配置文件示例 (nginx.conf)

http {
    # 开启服务器实时gzip
    gzip on;
    # 开启静态gz文件返回, 例如 /dist 文件夹的gz文件,其他的是实时压缩
    gzip_static on;
    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;
    # 设置压缩所需要的缓冲区大小
    gzip_buffers 32 4k;
    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.0;
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
    gzip_comp_level 7;
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    # 禁用IE 6 gzip
    gzip_disable "MSIE [1-6]\.";

    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 4096;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        listen [::]:80;
        server_name www.chujiaweicode.top;

        return 301 https://$server_name$request_uri;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /40x.html {}

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {}
    }

    server {
        listen 443 ssl; #修改端口号增加ssl
        server_name www.chujiaweicode.top;

        # ssl 配置
        ssl_certificate /usr/local/nginx/cert/chujiaweicode.top.pem;
        ssl_certificate_key /usr/local/nginx/cert/chujiaweicode.top.key;

        # 请按照以下协议配置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        # 配置加密套件,写法遵循 openssl 标准
        ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        location / {
            root /usr/local/front/myPortal/dist;
            index index.html index.htm;
            try_files $uri $uri/ /index.html;  # 处理前端路由刷新问题
        }

        location /ai {
            alias /usr/local/front/ai/dist;
            index index.html index.htm;
            try_files $uri $uri/ /index.html;  # 处理前端路由刷新问题
        }

        location /api/ {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

说明

  • 静态资源托管root /usr/local/front/myPortal/dist; 定义了静态文件的根目录,前端打包的文件会放在这个目录下。
  • 路由处理:使用 try_files 让 Nginx 将所有非静态文件的请求重定向到 index.html,适合 SPA(单页面应用)。
  • 反向代理:将 /api/ 路径下的所有请求转发到后端的 Node.js 服务上。
  • 压缩和缓存:启用了 gzip 压缩,并设置了静态文件的缓存时间以提高性能。
  • 错误页面:定义了 404 错误页面,便于定制化用户体验。