Nginx 安装与配置详解

Nginx 安装与配置详解

目录

  1. 简介
  2. Nginx 的特点与优势
  3. Nginx 的安装
  4. Nginx 的基本配置
  5. 配置虚拟主机
  6. 反向代理与负载均衡
  7. SSL/TLS 配置
  8. 常见模块与高级配置
  9. 日志与性能调优
  10. Nginx 与其他服务的集成
  11. 常见问题排查
  12. 总结

简介

Nginx(Engine X)是一款高性能的开源HTTP服务器和反向代理服务器,也可以作为邮件代理服务器使用。它由俄罗斯程序员 Igor Sysoev 于2004年发布,旨在解决高并发连接时的性能瓶颈问题。Nginx 以其高并发处理能力、低资源消耗和灵活的配置而著称,广泛应用于各类网站和互联网服务中。

Nginx 的特点与优势

  • 高性能:Nginx 使用异步事件驱动架构,能够高效地处理大量并发连接,性能优于传统的基于进程或线程的服务器(如 Apache)。
  • 低资源消耗:在处理高并发请求时,Nginx 的内存和 CPU 占用率相对较低。
  • 灵活的模块化设计:支持多种功能模块,如反向代理、负载均衡、缓存、Gzip 压缩等,可以根据需要进行配置和扩展。
  • 高可靠性:具有稳定的性能和高可用性,广泛应用于大规模互联网服务。
  • 易于配置:配置文件结构简洁,语法清晰,便于管理和维护。

Nginx 的安装

Nginx 可以在多种操作系统上运行,以下以常见的 Ubuntu/Debian 和 CentOS/RHEL 为例,介绍不同平台上的安装方法。此外,还将介绍如何通过源码编译安装 Nginx,以实现定制化需求。

在 Ubuntu/Debian 上安装

  1. 更新软件包列表

    sudo apt update
    
  2. 安装 Nginx

    sudo apt install nginx
    
  3. 启动 Nginx 并设置开机自启

    sudo systemctl start nginx
    sudo systemctl enable nginx
    
  4. 验证安装

    打开浏览器,访问服务器的 IP 地址或域名。如果看到 Nginx 默认的欢迎页面,说明安装成功。

在 CentOS/RHEL 上安装

  1. 安装 EPEL 仓库

    sudo yum install epel-release
    
  2. 安装 Nginx

    sudo yum install nginx
    
  3. 启动 Nginx 并设置开机自启

    sudo systemctl start nginx
    sudo systemctl enable nginx
    
  4. 配置防火墙

    sudo firewall-cmd --permanent --zone=public --add-service=http
    sudo firewall-cmd --permanent --zone=public --add-service=https
    sudo firewall-cmd --reload
    
  5. 验证安装

    打开浏览器,访问服务器的 IP 地址或域名,查看是否显示 Nginx 默认页面。

源码安装

通过源码安装 Nginx 可以实现更多的定制化配置,以下是基本步骤:

  1. 安装依赖

    • Ubuntu/Debian

      sudo apt update
      sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
      
    • CentOS/RHEL

      sudo yum groupinstall 'Development Tools'
      sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
      
  2. 下载 Nginx 源码

    wget http://nginx.org/download/nginx-1.23.4.tar.gz
    tar -zxvf nginx-1.23.4.tar.gz
    cd nginx-1.23.4
    
  3. 配置编译参数

    你可以根据需要添加模块或配置参数。例如:

    ./configure --prefix=/usr/local/nginx \
                --with-http_ssl_module \
                --with-pcre \
                --with-zlib=/path/to/zlib \
                --with-openssl=/path/to/openssl
    
  4. 编译与安装

    make
    sudo make install
    
  5. 启动 Nginx

    sudo /usr/local/nginx/sbin/nginx
    
  6. 验证安装

    访问服务器 IP 地址或域名,查看是否显示 Nginx 默认页面。

Nginx 的基本配置

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf(根据安装方式可能有所不同)。理解配置文件的结构和主要指令,有助于有效管理和优化 Nginx。

配置文件结构

Nginx 的配置文件采用模块化设计,主要分为以下几个部分:

  1. 全局块(main)

    包含与整个 Nginx 运行相关的配置,如用户、工作进程数、错误日志等。

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    
    events {
        worker_connections 1024;
    }
    
  2. HTTP 块

    包含与 HTTP 服务相关的配置,如 MIME 类型、日志、压缩、缓存、虚拟主机等。

    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;
        keepalive_timeout  65;
    
        include /etc/nginx/conf.d/*.conf;
    }
    
  3. 服务器块(server)

    定义虚拟主机,每个 server 块通常对应一个域名或 IP 地址。

    server {
        listen       80;
        server_name  example.com www.example.com;
    
        location / {
            root   /var/www/html;
            index  index.html index.htm;
        }
    }
    
  4. 位置块(location)

    定义请求 URI 的匹配规则,并指定如何处理匹配的请求。

    location /images/ {
        root /data;
    }
    

主要配置指令

以下是一些常见且重要的 Nginx 配置指令:

  • worker_processes:定义工作进程的数量,通常设置为 CPU 核心数。
  • worker_connections:每个工作进程允许的最大连接数。
  • server:定义虚拟主机,包含 listenserver_name 等指令。
  • location:定义 URI 匹配规则,包括前缀匹配和正则匹配。
  • root:指定请求资源的根目录。
  • index:定义默认的首页文件。
  • error_page:自定义错误页面。
  • proxy_pass:设置反向代理的目标地址。
  • ssl_certificatessl_certificate_key:指定 SSL 证书和私钥文件。
  • gzip:启用或配置 Gzip 压缩。

配置虚拟主机

虚拟主机允许在同一台物理服务器上托管多个网站或应用,基于不同的域名或 IP 地址进行区分。

HTTP 虚拟主机配置

假设我们有两个网站,分别是 example.comtest.com,可以通过以下方式配置两个虚拟主机。

  1. 创建网站目录

    sudo mkdir -p /var/www/example.com/html
    sudo mkdir -p /var/www/test.com/html
    sudo chown -R $USER:$USER /var/www/example.com/html
    sudo chown -R $USER:$USER /var/www/test.com/html
    
  2. 创建简单的首页文件

    • example.com

      echo "<h1>Welcome to example.com!</h1>" > /var/www/example.com/html/index.html
      
    • test.com

      echo "<h1>Welcome to test.com!</h1>" > /var/www/test.com/html/index.html
      
  3. 配置虚拟主机文件

    /etc/nginx/sites-available/(如果目录不存在,可以使用)创建两个配置文件:

    • example.com

      server {
          listen 80;
          server_name example.com www.example.com;
      
          root /var/www/example.com/html;
          index index.html index.htm;
      
          location / {
              try_files $uri $uri/ =404;
          }
      }
      
    • test.com

      server {
          listen 80;
          server_name test.com www.test.com;
      
          root /var/www/test.com/html;
          index index.html index.htm;
      
          location / {
              try_files $uri $uri/ =404;
          }
      }
      
  4. 启用虚拟主机

    如果使用 sites-availablesites-enabled 结构:

    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
    
  5. 测试配置并重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  6. DNS 配置

    确保 example.comtest.com 的 DNS 记录正确指向你的服务器 IP 地址。

多域名配置

通过在同一个 server 块中配置多个 server_name,可以处理多个域名指向同一个网站。例如:

server {
    listen 80;
    server_name example.com www.example.com test.com www.test.com;

    root /var/www/shared_site/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

这将使 example.comwww.example.comtest.comwww.test.com 都指向同一个网站目录。

反向代理与负载均衡

Nginx 不仅可以作为静态资源服务器,还可以作为反向代理,将请求转发到后端应用服务器。此外,Nginx 还支持多种负载均衡算法,提升应用的可用性和扩展性。

设置反向代理

假设我们有一个后端应用服务器运行在 http://127.0.0.1:8080,我们希望通过 Nginx 进行代理。

  1. 配置反向代理

    在虚拟主机的 location 块中添加 proxy_pass 指令:

    server {
        listen 80;
        server_name app.example.com;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            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;
        }
    }
    
  2. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  3. 验证

    访问 http://app.example.com,应能看到后端应用的内容。

配置负载均衡策略

Nginx 支持多种负载均衡算法,包括轮询(默认)、最少连接、IP 哈希等。以下以轮询和最少连接为例。

  1. 配置上游服务器组

    http 块中定义上游服务器组:

    http {
        ...
    
        upstream backend {
            # 轮询(默认)
            server backend1.example.com;
            server backend2.example.com;
            server backend3.example.com;
        }
    
        # 或者最少连接
        upstream backend_least_conn {
            least_conn;
            server backend1.example.com;
            server backend2.example.com;
            server backend3.example.com;
        }
    
        ...
    }
    
  2. 在虚拟主机中使用上游服务器组

    server {
        listen 80;
        server_name loadbalancer.example.com;
    
        location / {
            proxy_pass http://backend;
            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;
        }
    }
    
  3. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  4. 验证

    访问 http://loadbalancer.example.com,请求将按照配置的负载均衡策略分发到后端服务器。

SSL/TLS 配置

为网站启用 HTTPS,可以提高数据传输的安全性。以下是配置 SSL 的基本步骤。

获取 SSL 证书

可以通过购买商业证书、使用免费证书(如 Let’s Encrypt)或自签名证书获取 SSL 证书。以下以 Let’s Encrypt 为例。

  1. 安装 Certbot

    • Ubuntu/Debian

      sudo apt install certbot python3-certbot-nginx
      
    • CentOS/RHEL

      sudo yum install certbot python3-certbot-nginx
      
  2. 获取并自动配置 SSL 证书

    sudo certbot --nginx -d example.com -d www.example.com
    

    按照提示完成域名验证和证书安装。

配置 HTTPS

如果手动配置 SSL,可以参考以下步骤。

  1. 修改虚拟主机配置

    server {
        listen 80;
        server_name example.com www.example.com;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name example.com www.example.com;
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
    
        root /var/www/example.com/html;
        index index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

    以上配置将 HTTP 请求重定向到 HTTPS,同时配置 SSL 证书和相关参数。

  2. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  3. 验证

    访问 https://example.com,应看到安全锁标志,确认 HTTPS 配置成功。

常见模块与高级配置

Nginx 提供了多种模块,支持丰富的功能。以下介绍一些常用模块和高级配置。

Gzip 压缩

启用 Gzip 可以减少传输内容的大小,提高页面加载速度。

  1. 启用 Gzip

    http 块中添加以下配置:

    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_vary on;
    
        ...
    }
    
    • gzip:启用或禁用 Gzip。
    • gzip_types:指定要压缩的 MIME 类型。
    • gzip_min_length:设置启用压缩的最小响应体长度。
    • gzip_comp_level:指定压缩级别(1-9)。
    • gzip_vary:根据客户端的 Accept-Encoding 头部决定是否压缩。
  2. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  3. 验证

    使用浏览器的开发者工具或在线工具检查响应头,确认 Content-Encoding: gzip 是否存在。

缓存配置

Nginx 支持多种缓存机制,包括 FastCGI 缓存、代理缓存和内容缓存等。以下以代理缓存为例。

  1. 配置缓存路径

    http 块中定义缓存路径和相关参数:

    http {
        ...
    
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
    
        ...
    }
    
    • proxy_cache_path:定义缓存的存储路径及参数。
    • levels:定义缓存文件的目录结构。
    • keys_zone:定义缓存区域名称及大小。
    • max_size:缓存的最大容量。
    • inactive:定义缓存项在未被访问后的过期时间。
    • use_temp_path:是否使用临时路径。
  2. 在服务器块中使用缓存

    server {
        listen 80;
        server_name cache.example.com;
    
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
    
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Proxy-Cache $upstream_cache_status;
        }
    }
    
    • proxy_cache:指定使用的缓存区域。
    • proxy_cache_valid:设置不同响应状态下的缓存时间。
    • add_header:添加自定义响应头,便于调试缓存状态。
  3. 创建缓存目录并设置权限

    sudo mkdir -p /var/cache/nginx
    sudo chown -R www-data:www-data /var/cache/nginx
    
  4. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  5. 验证

    访问 http://cache.example.com,检查响应头中的 X-Proxy-Cache,应显示 MISSHIT

访问控制

通过配置访问控制,可以限制特定 IP 地址或用户对网站的访问。

  1. 基于 IP 的访问控制

    server {
        listen 80;
        server_name secure.example.com;
    
        location / {
            allow 192.168.1.0/24;
            deny all;
    
            root /var/www/secure.html;
            index index.html;
        }
    }
    

    上述配置只允许 192.168.1.0/24 网段的 IP 访问,其他 IP 将被拒绝。

  2. 基于密码的访问控制

    使用 .htpasswd 文件进行基本认证。

    • 安装 apache2-utils

      sudo apt install apache2-utils
      
    • 创建密码文件

      sudo htpasswd -c /etc/nginx/.htpasswd user1
      
    • 配置 Nginx

      server {
          listen 80;
          server_name auth.example.com;
      
          location / {
              auth_basic "Restricted Area";
              auth_basic_user_file /etc/nginx/.htpasswd;
      
              root /var/www/auth;
              index index.html;
          }
      }
      
  3. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    

日志与性能调优

合理配置日志和进行性能优化,可以提升 Nginx 的运行效率和问题排查能力。

日志配置

Nginx 提供访问日志和错误日志,帮助手动分析流量和错误。

  1. 访问日志(access_log)

    示例配置:

    http {
        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;
    
        ...
    }
    
  2. 错误日志(error_log)

    示例配置:

    http {
        error_log /var/log/nginx/error.log warn;
    
        ...
    }
    

    错误日志等级可选: debuginfonoticewarnerrorcritalertemerg

  3. 按虚拟主机配置日志

    server {
        listen 80;
        server_name example.com;
    
        access_log /var/log/nginx/example.com.access.log main;
        error_log /var/log/nginx/example.com.error.log warn;
    
        ...
    }
    

性能优化建议

  1. 调整 worker_processesworker_connections

    根据服务器的 CPU 核心数和预期的并发连接数,合理设置这两个参数。

    worker_processes auto;
    events {
        worker_connections 4096;
        multi_accept on;
        use epoll; # 对于 Linux 系统
    }
    
  2. 启用 sendfiletcp_nopush

    http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
    
        ...
    }
    
  3. 限制请求速率

    防止恶意请求影响服务器性能。

    http {
        limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
        server {
            ...
    
            location /search/ {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend;
            }
        }
    }
    
  4. 优化缓存策略

    合理配置缓存,提高内容的重用率,减少后端服务器负载。

  5. 开启 HTTP/2

    提升 HTTPS 网站的性能。

    server {
        listen 443 ssl http2;
        server_name example.com;
    
        ...
    }
    
  6. 使用压缩

    如前述 Gzip 压缩配置,进一步减少传输数据量。

Nginx 与其他服务的集成

Nginx 常与后端应用服务器(如 PHP-FPM)和数据库等服务集成,实现完整的 Web 服务体系。

PHP-FPM 集成

将 Nginx 与 PHP-FPM 配合使用,处理 PHP 动态页面。

  1. 安装 PHP-FPM

    • Ubuntu/Debian

      sudo apt install php-fpm
      
    • CentOS/RHEL

      sudo yum install php-fpm
      
  2. 配置 PHP-FPM

    编辑 /etc/php/7.x/fpm/pool.d/www.conf(版本号可能不同),确保 listen 参数设置为 Nginx 可访问的地址。

    listen = /run/php/php7.x-fpm.sock
    

    或者使用 TCP 端口:

    listen = 127.0.0.1:9000
    
  3. 配置 Nginx

    在虚拟主机中添加 PHP 处理规则:

    server {
        listen 80;
        server_name php.example.com;
    
        root /var/www/php_site;
        index index.php index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.x-fpm.sock;
            # 或者使用 TCP 端口
            # fastcgi_pass 127.0.0.1:9000;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    
  4. 启动并启用 PHP-FPM

    sudo systemctl start php7.x-fpm
    sudo systemctl enable php7.x-fpm
    
  5. 重启 Nginx

    sudo nginx -t
    sudo systemctl restart nginx
    
  6. 验证

    在网站根目录下创建一个 info.php 文件:

    <?php
    phpinfo();
    ?>
    

    访问 http://php.example.com/info.php,应显示 PHP 信息页面。

与 MySQL 等后端服务集成

Nginx 本身不直接与数据库交互,但可以通过后端应用服务器与数据库集成,实现动态数据驱动的 Web 应用。

  1. 部署后端应用

    例如,使用 Node.js、Python(Django、Flask)、PHP 等框架开发应用,与 MySQL 数据库交互。

  2. 配置反向代理

    将 Nginx 配置为前端反向代理,将请求转发到后端应用服务器。例如:

    server {
        listen 80;
        server_name app.example.com;
    
        location / {
            proxy_pass http://127.0.0.1:5000;
            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;
        }
    }
    
  3. 确保后端应用与数据库的连通性

    配置好后端应用的数据库连接参数,确保应用可以正常访问 MySQL 或其他数据库。

常见问题排查

在 Nginx 的使用过程中,可能会遇到各种问题,以下是一些常见问题及解决方法。

Nginx 无法启动或配置出错

  1. 检查配置文件语法

    sudo nginx -t
    

    输出中若有错误信息,根据提示修改配置文件。

  2. 查看错误日志

    sudo tail -f /var/log/nginx/error.log
    

    通过错误日志了解具体问题。

访问网站出现 403 Forbidden

  1. 检查文件权限

    确保 Nginx 用户(如 www-datanginx)有权限访问网站目录和文件。

    sudo chown -R www-data:www-data /var/www/example.com
    sudo chmod -R 755 /var/www/example.com
    
  2. 检查 Nginx 配置

    确保 root 指令指向正确的目录,且有 index 文件。

    location / {
        root /var/www/example.com/html;
        index index.html index.htm;
    }
    

502 Bad Gateway

通常是后端服务器问题,以下是排查步骤:

  1. 检查后端服务是否运行

    确保后端应用服务器(如 PHP-FPM、Node.js)正在运行,并监听正确的地址和端口。

  2. 检查 Nginx 代理配置

    确保 proxy_pass 指向正确的地址和端口。

  3. 查看后端服务日志

    分析后端应用的日志,了解具体错误原因。

SSL 证书错误

  1. 确认证书文件路径正确

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
  2. 检查证书是否过期

    使用命令查看证书有效期:

    sudo certbot certificates
    
  3. 确保证书与域名匹配

    证书中的 CN 或 SAN 项应包含当前访问的域名。

总结

本文详尽介绍了 Nginx 的安装与配置,包括在不同操作系统上的安装步骤、基本和高级配置、虚拟主机的设置、反向代理与负载均衡、SSL/TLS 配置、常见模块的应用、性能优化以及与其他服务的集成。同时,也涵盖了常见问题的排查方法。通过本文的学习,您应能够熟练地部署和管理基于 Nginx 的高性能 Web 服务器,满足各种应用场景的需求。

实践中,建议结合具体需求和环境进一步探索 Nginx 的高级功能,如动态模块、Lua 脚本集成、安全增强策略等,以全面提升网站或应用的性能与安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值