Nginx(发音为“engine X”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它以其高并发处理能力、低内存消耗和丰富的功能集而闻名。在Web服务器领域,Nginx已经成为许多大型网站和应用的首选。本文将深入探讨Nginx的使用,从基础配置到高级优化,并通过详细的代码示例来展示各种功能。
一、Nginx基础安装与配置
1. 安装Nginx
以CentOS系统为例,可以通过以下命令安装Nginx:
sudo yum install nginx ## 安装Nginx服务
sudo systemctl start nginx ## 启动Nginx服务
sudo systemctl enable nginx ## (可选)设置Nginx开机自启
安装完成后,可以通过浏览器访问http://localhost来验证安装是否成功。
2. Nginx配置文件结构
- 配置文件:/etc/nginx/nginx.conf
- 默认服务器的网站内容:/usr/share/nginx/html
- 日志文件:
- 访问日志:/var/log/nginx/access.log
- 错误日志:/var/log/nginx/error.log
- 服务控制脚本:/usr/lib/systemd/system/nginx.service
- 可执行文件:/usr/sbin/nginx
3. 基础配置示例
以下是一个简单的Nginx服务器配置示例,用于服务一个静态网站:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
配置定义了一个监听80端口的服务器,其根目录设置为/usr/share/nginx/html,并且设置了错误页面的位置。此配置Nginx通过正则表达式匹配静态文件的请(如.jpg、.png、.gif、.css、.js),并直接从文件系统中提供这些文件。还可以通过proxy_pass指令设置反向代理。
二、Nginx作为反向代理
Nginx作为反向代理服务器,可以接收客户端的请求,并将这些请求转发到内部网络中的其他服务器。这对于负载均衡和安全性(如隐藏后端服务器)非常有用。
示例配置
http {
upstream dynamic_server {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
server 192.168.1.102:8080 backup; # 备份服务器
}
server {
listen 80;
server_name localhost;
root /opt/app/code;
# 静态文件处理
location ~* \.(jpg|png|gif|css|js)$ {
expires 1h;
gzip on;
try_files $uri $uri/ =404;
}
# 动态请求处理
location / {
proxy_pass http://dynamic_server;
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监听80端口并通过正则表达式匹配静态文件的请(如.jpg、.png、.gif、.css、.js),并直接从文件系统中提供这些文件。而所有其他请求则通过proxy_pass指令转发到dynamic_server这个upstream组中的服务器。upstream组定义了三个后端服务器,负载均衡策略(默认为轮询)。Nginx还设置了几个重要的HTTP头部,以便后端服务器能够获取关于原始请求的信息。
三、Nginx性能优化
1. 调整工作进程数
Nginx默认使用与CPU核心数相等的工作进程数。在/etc/nginx/nginx.conf中,可以通过修改worker_processes指令来调整:
worker_processes auto; # 或者指定具体数字,如 worker_processes 4;
2. 优化文件缓存
通过调整Nginx的文件缓存设置,可以减少对磁盘的访问次数,提高性能。
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
3. 使用Gzip压缩
Gzip压缩可以显著减少传输的数据量,加快页面加载速度。
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
四、SSL/TLS配置
为了增强网站的安全性,可以配置Nginx以支持HTTPS。这通常涉及到安装SSL/TLS证书。
server {
listen 443 ssl;
server_name example.com;
# SSL证书和密钥路径
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSL会话缓存
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# SSL协议和加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 根据需要调整支持的协议
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# HSTS策略(可选,但推荐)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# 其他的location配置...
}
# 错误页面配置...
# 日志配置...
# 其他HTTP头配置...
}
# 重定向HTTP到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
配置中,定义了两个server块:
- 第一个
server块监听443端口,并配置了SSL证书和密钥的路径。同时,它还设置了SSL会话缓存、支持的SSL协议和加密算法。此外,还通过add_header指令添加了HSTS(HTTP严格传输安全)头部,以增强安全性。 - 第二个
server块监听80端口,用于将所有HTTP请求重定向到HTTPS。这是通过返回301状态码和新的HTTPS URL来实现的。
*请注意,需要将/etc/nginx/ssl/example.com.crt和/etc/nginx/ssl/example.com.key替换为自己的证书和密钥文件的实际路径。此外,SSL协议和加密算法列表可能需要根据具体需求和安全策略进行调整。
在修改配置后,别忘了重新加载或重启Nginx以使更改生效:
sudo nginx -t # 测试配置文件的语法是否正确
sudo systemctl reload nginx # 重新加载Nginx配置
sudo systemctl restart nginx # 重启Nginx服务