Nginx 安装与配置详解
目录
- 简介
- Nginx 的特点与优势
- Nginx 的安装
- Nginx 的基本配置
- 配置虚拟主机
- 反向代理与负载均衡
- SSL/TLS 配置
- 常见模块与高级配置
- 日志与性能调优
- Nginx 与其他服务的集成
- 常见问题排查
- 总结
简介
Nginx(Engine X)是一款高性能的开源HTTP服务器和反向代理服务器,也可以作为邮件代理服务器使用。它由俄罗斯程序员 Igor Sysoev 于2004年发布,旨在解决高并发连接时的性能瓶颈问题。Nginx 以其高并发处理能力、低资源消耗和灵活的配置而著称,广泛应用于各类网站和互联网服务中。
Nginx 的特点与优势
- 高性能:Nginx 使用异步事件驱动架构,能够高效地处理大量并发连接,性能优于传统的基于进程或线程的服务器(如 Apache)。
- 低资源消耗:在处理高并发请求时,Nginx 的内存和 CPU 占用率相对较低。
- 灵活的模块化设计:支持多种功能模块,如反向代理、负载均衡、缓存、Gzip 压缩等,可以根据需要进行配置和扩展。
- 高可靠性:具有稳定的性能和高可用性,广泛应用于大规模互联网服务。
- 易于配置:配置文件结构简洁,语法清晰,便于管理和维护。
Nginx 的安装
Nginx 可以在多种操作系统上运行,以下以常见的 Ubuntu/Debian 和 CentOS/RHEL 为例,介绍不同平台上的安装方法。此外,还将介绍如何通过源码编译安装 Nginx,以实现定制化需求。
在 Ubuntu/Debian 上安装
-
更新软件包列表
sudo apt update
-
安装 Nginx
sudo apt install nginx
-
启动 Nginx 并设置开机自启
sudo systemctl start nginx sudo systemctl enable nginx
-
验证安装
打开浏览器,访问服务器的 IP 地址或域名。如果看到 Nginx 默认的欢迎页面,说明安装成功。
在 CentOS/RHEL 上安装
-
安装 EPEL 仓库
sudo yum install epel-release
-
安装 Nginx
sudo yum install nginx
-
启动 Nginx 并设置开机自启
sudo systemctl start nginx sudo systemctl enable nginx
-
配置防火墙
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload
-
验证安装
打开浏览器,访问服务器的 IP 地址或域名,查看是否显示 Nginx 默认页面。
源码安装
通过源码安装 Nginx 可以实现更多的定制化配置,以下是基本步骤:
-
安装依赖
-
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
-
-
下载 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
-
配置编译参数
你可以根据需要添加模块或配置参数。例如:
./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-pcre \ --with-zlib=/path/to/zlib \ --with-openssl=/path/to/openssl
-
编译与安装
make sudo make install
-
启动 Nginx
sudo /usr/local/nginx/sbin/nginx
-
验证安装
访问服务器 IP 地址或域名,查看是否显示 Nginx 默认页面。
Nginx 的基本配置
Nginx 的配置文件通常位于 /etc/nginx/nginx.conf
(根据安装方式可能有所不同)。理解配置文件的结构和主要指令,有助于有效管理和优化 Nginx。
配置文件结构
Nginx 的配置文件采用模块化设计,主要分为以下几个部分:
-
全局块(main)
包含与整个 Nginx 运行相关的配置,如用户、工作进程数、错误日志等。
user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 1024; }
-
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; }
-
服务器块(server)
定义虚拟主机,每个
server
块通常对应一个域名或 IP 地址。server { listen 80; server_name example.com www.example.com; location / { root /var/www/html; index index.html index.htm; } }
-
位置块(location)
定义请求 URI 的匹配规则,并指定如何处理匹配的请求。
location /images/ { root /data; }
主要配置指令
以下是一些常见且重要的 Nginx 配置指令:
- worker_processes:定义工作进程的数量,通常设置为 CPU 核心数。
- worker_connections:每个工作进程允许的最大连接数。
- server:定义虚拟主机,包含
listen
、server_name
等指令。 - location:定义 URI 匹配规则,包括前缀匹配和正则匹配。
- root:指定请求资源的根目录。
- index:定义默认的首页文件。
- error_page:自定义错误页面。
- proxy_pass:设置反向代理的目标地址。
- ssl_certificate 和 ssl_certificate_key:指定 SSL 证书和私钥文件。
- gzip:启用或配置 Gzip 压缩。
配置虚拟主机
虚拟主机允许在同一台物理服务器上托管多个网站或应用,基于不同的域名或 IP 地址进行区分。
HTTP 虚拟主机配置
假设我们有两个网站,分别是 example.com
和 test.com
,可以通过以下方式配置两个虚拟主机。
-
创建网站目录
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
-
创建简单的首页文件
-
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
-
-
配置虚拟主机文件
在
/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; } }
-
-
启用虚拟主机
如果使用
sites-available
和sites-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/
-
测试配置并重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
DNS 配置
确保
example.com
和test.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.com
、www.example.com
、test.com
和 www.test.com
都指向同一个网站目录。
反向代理与负载均衡
Nginx 不仅可以作为静态资源服务器,还可以作为反向代理,将请求转发到后端应用服务器。此外,Nginx 还支持多种负载均衡算法,提升应用的可用性和扩展性。
设置反向代理
假设我们有一个后端应用服务器运行在 http://127.0.0.1:8080
,我们希望通过 Nginx 进行代理。
-
配置反向代理
在虚拟主机的
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; } }
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
访问
http://app.example.com
,应能看到后端应用的内容。
配置负载均衡策略
Nginx 支持多种负载均衡算法,包括轮询(默认)、最少连接、IP 哈希等。以下以轮询和最少连接为例。
-
配置上游服务器组
在
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; } ... }
-
在虚拟主机中使用上游服务器组
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; } }
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
访问
http://loadbalancer.example.com
,请求将按照配置的负载均衡策略分发到后端服务器。
SSL/TLS 配置
为网站启用 HTTPS,可以提高数据传输的安全性。以下是配置 SSL 的基本步骤。
获取 SSL 证书
可以通过购买商业证书、使用免费证书(如 Let’s Encrypt)或自签名证书获取 SSL 证书。以下以 Let’s Encrypt 为例。
-
安装 Certbot
-
Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx
-
CentOS/RHEL
sudo yum install certbot python3-certbot-nginx
-
-
获取并自动配置 SSL 证书
sudo certbot --nginx -d example.com -d www.example.com
按照提示完成域名验证和证书安装。
配置 HTTPS
如果手动配置 SSL,可以参考以下步骤。
-
修改虚拟主机配置
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 证书和相关参数。
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
访问
https://example.com
,应看到安全锁标志,确认 HTTPS 配置成功。
常见模块与高级配置
Nginx 提供了多种模块,支持丰富的功能。以下介绍一些常用模块和高级配置。
Gzip 压缩
启用 Gzip 可以减少传输内容的大小,提高页面加载速度。
-
启用 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
头部决定是否压缩。
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
使用浏览器的开发者工具或在线工具检查响应头,确认
Content-Encoding: gzip
是否存在。
缓存配置
Nginx 支持多种缓存机制,包括 FastCGI 缓存、代理缓存和内容缓存等。以下以代理缓存为例。
-
配置缓存路径
在
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:是否使用临时路径。
-
在服务器块中使用缓存
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:添加自定义响应头,便于调试缓存状态。
-
创建缓存目录并设置权限
sudo mkdir -p /var/cache/nginx sudo chown -R www-data:www-data /var/cache/nginx
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
访问
http://cache.example.com
,检查响应头中的X-Proxy-Cache
,应显示MISS
或HIT
。
访问控制
通过配置访问控制,可以限制特定 IP 地址或用户对网站的访问。
-
基于 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 将被拒绝。 -
基于密码的访问控制
使用
.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; } }
-
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
日志与性能调优
合理配置日志和进行性能优化,可以提升 Nginx 的运行效率和问题排查能力。
日志配置
Nginx 提供访问日志和错误日志,帮助手动分析流量和错误。
-
访问日志(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; ... }
-
错误日志(error_log)
示例配置:
http { error_log /var/log/nginx/error.log warn; ... }
错误日志等级可选:
debug
、info
、notice
、warn
、error
、crit
、alert
、emerg
。 -
按虚拟主机配置日志
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; ... }
性能优化建议
-
调整
worker_processes
和worker_connections
根据服务器的 CPU 核心数和预期的并发连接数,合理设置这两个参数。
worker_processes auto; events { worker_connections 4096; multi_accept on; use epoll; # 对于 Linux 系统 }
-
启用
sendfile
和tcp_nopush
http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; ... }
-
限制请求速率
防止恶意请求影响服务器性能。
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; } } }
-
优化缓存策略
合理配置缓存,提高内容的重用率,减少后端服务器负载。
-
开启 HTTP/2
提升 HTTPS 网站的性能。
server { listen 443 ssl http2; server_name example.com; ... }
-
使用压缩
如前述 Gzip 压缩配置,进一步减少传输数据量。
Nginx 与其他服务的集成
Nginx 常与后端应用服务器(如 PHP-FPM)和数据库等服务集成,实现完整的 Web 服务体系。
PHP-FPM 集成
将 Nginx 与 PHP-FPM 配合使用,处理 PHP 动态页面。
-
安装 PHP-FPM
-
Ubuntu/Debian
sudo apt install php-fpm
-
CentOS/RHEL
sudo yum install php-fpm
-
-
配置 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
-
配置 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; } }
-
启动并启用 PHP-FPM
sudo systemctl start php7.x-fpm sudo systemctl enable php7.x-fpm
-
重启 Nginx
sudo nginx -t sudo systemctl restart nginx
-
验证
在网站根目录下创建一个
info.php
文件:<?php phpinfo(); ?>
访问
http://php.example.com/info.php
,应显示 PHP 信息页面。
与 MySQL 等后端服务集成
Nginx 本身不直接与数据库交互,但可以通过后端应用服务器与数据库集成,实现动态数据驱动的 Web 应用。
-
部署后端应用
例如,使用 Node.js、Python(Django、Flask)、PHP 等框架开发应用,与 MySQL 数据库交互。
-
配置反向代理
将 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; } }
-
确保后端应用与数据库的连通性
配置好后端应用的数据库连接参数,确保应用可以正常访问 MySQL 或其他数据库。
常见问题排查
在 Nginx 的使用过程中,可能会遇到各种问题,以下是一些常见问题及解决方法。
Nginx 无法启动或配置出错
-
检查配置文件语法
sudo nginx -t
输出中若有错误信息,根据提示修改配置文件。
-
查看错误日志
sudo tail -f /var/log/nginx/error.log
通过错误日志了解具体问题。
访问网站出现 403 Forbidden
-
检查文件权限
确保 Nginx 用户(如
www-data
或nginx
)有权限访问网站目录和文件。sudo chown -R www-data:www-data /var/www/example.com sudo chmod -R 755 /var/www/example.com
-
检查 Nginx 配置
确保
root
指令指向正确的目录,且有index
文件。location / { root /var/www/example.com/html; index index.html index.htm; }
502 Bad Gateway
通常是后端服务器问题,以下是排查步骤:
-
检查后端服务是否运行
确保后端应用服务器(如 PHP-FPM、Node.js)正在运行,并监听正确的地址和端口。
-
检查 Nginx 代理配置
确保
proxy_pass
指向正确的地址和端口。 -
查看后端服务日志
分析后端应用的日志,了解具体错误原因。
SSL 证书错误
-
确认证书文件路径正确
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
-
检查证书是否过期
使用命令查看证书有效期:
sudo certbot certificates
-
确保证书与域名匹配
证书中的 CN 或 SAN 项应包含当前访问的域名。
总结
本文详尽介绍了 Nginx 的安装与配置,包括在不同操作系统上的安装步骤、基本和高级配置、虚拟主机的设置、反向代理与负载均衡、SSL/TLS 配置、常见模块的应用、性能优化以及与其他服务的集成。同时,也涵盖了常见问题的排查方法。通过本文的学习,您应能够熟练地部署和管理基于 Nginx 的高性能 Web 服务器,满足各种应用场景的需求。
实践中,建议结合具体需求和环境进一步探索 Nginx 的高级功能,如动态模块、Lua 脚本集成、安全增强策略等,以全面提升网站或应用的性能与安全性。