一、Nginx 简介
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。它以其高并发处理能力、低内存占用和强大的功能而受到广泛应用。
二、Nginx 安装
1. 准备工作
- 操作系统要求:Nginx 可以在多种操作系统上运行,如 Linux、Unix 和 Windows 等。本教程以 Linux(以 CentOS 为例)为例进行讲解。
- 安装依赖包:在 CentOS 上,需要安装一些依赖包,如
gcc、pcre-devel、zlib-devel、openssl-devel。可以使用以下命令安装:
yum install -y gcc pcre-devel zlib-devel openssl-devel
2. 下载 Nginx
- 从 Nginx 官方网站(nginx.org/)下载稳定版本的 Nginx 源代码。例如,使用
wget命令下载:
wget http://nginx.org/download/nginx-<version>.tar.gz
其中<version>是要下载的版本号,如1.24.0。
3. 编译和安装
- 解压下载的源代码包:
tar -zxvf nginx-<version>.tar.gz
- 进入解压后的目录:
cd nginx-<version>
- 配置 Nginx:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
这里--prefix指定 Nginx 的安装目录,--with-http_ssl_module启用 SSL 模块(用于 HTTPS),--with-http_stub_status_module用于启用状态监控模块。
- 编译和安装:
make
make install
4. 启动 Nginx
- 安装完成后,可以在
/usr/local/nginx/sbin目录下找到 Nginx 的可执行文件。使用以下命令启动 Nginx:
/usr/local/nginx/sbin/nginx
- 可以通过访问服务器的 IP 地址(如果服务器有公网 IP)或
localhost(在本地测试)来检查 Nginx 是否启动成功。默认情况下,Nginx 监听 80 端口。
三、Nginx 配置文件结构
- Nginx 的主配置文件通常位于
/usr/local/nginx/conf/nginx.conf。 - 配置文件分为几个部分:
-
- main 块:主要设置一些影响 Nginx 全局的指令,如
worker_processes(工作进程数)、error_log(错误日志路径)等。 - events 块:用于处理网络连接相关的设置,如
worker_connections(每个工作进程的最大连接数)。 - http 块:用于配置 HTTP 相关的功能,包括服务器配置、虚拟主机、MIME 类型、日志格式、访问控制等。
- server 块:定义虚拟主机,每个
server块可以配置域名、端口、根目录、请求处理规则等。 - location 块:用于对特定的 URI 进行请求处理规则的配置,可在
server块内定义。
- main 块:主要设置一些影响 Nginx 全局的指令,如
四、Nginx 优化
1. 优化工作进程数
- 根据服务器的 CPU 核心数来合理设置
worker_processes。一般情况下,可以设置为 CPU 核心数。例如,如果服务器有 4 个 CPU 核心,可以在main块中设置:
worker_processes 4;
2. 调整每个工作进程的连接数
- 根据服务器的内存和预期的并发连接数,调整
worker_connections的值。注意不要设置过高,以免耗尽服务器资源。例如:
events {
worker_connections 1024;
}
3. 启用缓存
- 可以在
http块中设置缓存相关的指令。例如,设置缓存区域和缓存时间:
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 10m;
proxy_pass http://backend_server;
}
}
}
这里定义了一个缓存区域my_cache,并在location块中对特定的请求启用缓存。
4. 文件描述符优化
- 增加系统的文件描述符限制。可以通过修改
/etc/security/limits.conf文件,添加以下内容(这里以设置为 65535 为例):
* soft nofile 65535
* hard nofile 65535
五、Nginx 反向代理
1. 基本配置
- 假设后端有一个服务器运行在
http://192.168.1.100:8080,要将example.com域名的请求反向代理到后端服务器,可以在nginx.conf的http块中配置如下:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://192.168.1.100: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_pass指定后端服务器的地址,proxy_set_header指令用于设置传递给后端服务器的请求头信息。
2. 根据路径反向代理
-
如果要根据不同的路径将请求代理到不同的后端服务器,可以使用多个
location块。例如:
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://api_server: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;
}
location /web {
proxy_pass http://web_server:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
六、Nginx 负载均衡
1. 轮询(Round - Robin)模式
- 在
http块中定义一个upstream块来配置后端服务器集群,然后在server块的proxy_pass中使用该upstream名称。例如:
http {
upstream backend_pool {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
这种方式下,Nginx 会按照顺序依次将请求分配到后端服务器上。
2. 加权轮询(Weighted Round - Robin)模式
- 如果后端服务器的性能不同,可以为服务器设置权重。例如:
http {
upstream backend_pool {
server 192.168.1.100:8080 weight=2;
server 192.168.1.101:8080 weight=1;
}
// 后续 server 块配置同轮询模式
}
这里服务器192.168.1.100:8080的权重为 2,会接收两倍于192.168.1.101:8080的请求。
3. IP 哈希(IP Hash)模式
- 使用客户端的 IP 地址来确定将请求分配到哪个后端服务器。这样可以保证同一客户端的请求总是被转发到同一台后端服务器,适用于有状态的应用。例如:
http {
upstream backend_pool {
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
// 后续 server 块配置同轮询模式
}
七、Nginx 集群
1. 基于 Keepalived 的高可用集群
- 安装 Keepalived:在两台 Nginx 服务器(假设 IP 分别为
192.168.1.10和192.168.1.11)上安装 Keepalived。在 CentOS 上,可以使用yum install -y keepalived命令安装。 - 配置 Keepalived:
-
- 在
192.168.1.10上的/etc/keepalived/keepalived.conf配置文件示例:
- 在
! Configuration File for keepalived
global_defs {
notification_email {
your_email@example.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL_10
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200
}
track_script {
chk_nginx
}
}
这里定义了一个vrrp_script来检查 Nginx 的运行状态,如果 Nginx 停止,降低 Keepalived 的优先级。vrrp_instance中设置了MASTER状态、虚拟路由器 ID、优先级等信息,并指定了虚拟 IP 地址192.168.1.200。
- 在
192.168.1.11上的keepalived.conf配置类似,但state设置为BACKUP,priority设置为 90。 - 编写 Nginx 状态检查脚本(以
/etc/keepalived/check_nginx.sh为例) :
#!/bin/bash
count=$(ps -C nginx --no-header | wc -l)
if [ $count -eq 0 ]; then
systemctl start nginx
sleep 2
count=$(ps -C nginx --no-header | wc -l)
if [ $count -eq 0 ]; then
systemctl stop keepalived
fi
fi
这个脚本检查 Nginx 是否在运行,如果停止则尝试启动,如果启动失败则停止 Keepalived,触发虚拟 IP 的切换。
2. 基于 DNS 轮询的集群
- 在 DNS 服务器上配置域名解析,将域名解析到多个 Nginx 服务器的 IP 地址。例如,对于
example.com域名,在 DNS 配置中添加两条 A 记录:
example.com. IN A 192.168.1.10
example.com. IN A 192.168.1.11
这样,客户端在访问example.com时,DNS 服务器会轮询地返回不同的 Nginx 服务器 IP 地址,实现简单的负载均衡和高可用性。不过这种方式可能存在一些问题,如 DNS 缓存可能导致负载不均衡,并且故障切换可能不够及时。