学习NGINX的详细四步计划
第一步:基础入门与核心概念理解
学习目标: 了解NGINX是什么、为什么使用它,并完成安装和基本运行。
- 理解NGINX是什么
· 答案: NGINX (发音为"engine X") 是一个开源的、高性能的 HTTP和反向代理服务器,同时也是一个邮件代理服务器 和通用的TCP/UDP代理服务器。它的核心特点是采用事件驱动 和异步非阻塞 的架构,使其能够处理极高的并发连接,且资源占用极低。
- 了解NGINX的核心应用场景
· 答案: · 静态内容服务: 快速高效地处理(提供)HTML、CSS、JavaScript、图片等静态文件。这是它最基础也是最擅长的功能。 · 反向代理: 作为后端应用服务器(如Node.js, Python, Java应用)的屏障,接收客户端请求并转发给后端服务器,然后将结果返回给客户端。这可以隐藏后端结构、提高安全性。 · 负载均衡: 将网络流量分发到多个后端服务器,以避免任何单一服务器过载,从而提高性能、吞吐量和可靠性。 · SSL终端: 处理HTTPS连接的加密和解密工作,减轻后端服务器的计算压力。 · 缓存: 缓存来自后端服务器的响应,对于相同的请求,可直接从缓存中返回,极大提升响应速度。 · API网关: 作为所有API请求的单一入口,统一处理认证、限流、日志等横切关注点。
- 动手安装与验证
· 操作步骤: 1. 更新软件包列表:
```bash # 对于Ubuntu/Debian系统 sudo apt update # 对于CentOS/RHEL系统 sudo yum update ``` 2. 安装NGINX: ```bash # 对于Ubuntu/Debian系统 sudo apt install nginx # 对于CentOS/RHEL系统 sudo yum install nginx ``` 3. 启动并设置开机自启: ```bash sudo systemctl start nginx sudo systemctl enable nginx ``` 4. 检查运行状态: ```bash sudo systemctl status nginx ``` · 期望答案: 你应该看到输出中包含 active (running) 的字样。 5. 验证安装: · 打开浏览器,输入你的服务器IP地址或 http://localhost。 · 期望答案: 你应该看到NGINX的默认欢迎页面,上面写着 "Welcome to nginx!"。
第二步:核心配置结构与静态网站部署
学习目标: 掌握NGINX配置文件的核心结构,并成功部署一个自定义的静态网站。
- 掌握核心配置文件与结构
· 答案: NGINX的配置是由多个层级的块(Context) 和指令(Directive) 组成的。 · 主配置文件: /etc/nginx/nginx.conf · 包含其他配置: 主配置文件通常会使用 include 指令引入其他目录下的配置文件,例如 /etc/nginx/conf.d/.conf 和 /etc/nginx/sites-enabled/。这是一种模块化的最佳实践。 · 核心配置块: · main: 全局配置,位于所有块之外(例如:工作进程数、用户、错误日志)。 · events: 配置网络连接的处理模型。 · http: 包含所有HTTP相关的配置,可以嵌套多个 server 块。 · server: 定义一个虚拟主机,用于处理特定的域名或端口。可以嵌套多个 location 块。 · location: 根据请求的URI(路径)来匹配和处理请求,是配置中最灵活和核心的部分。
- 理解关键指令
· 答案: · server { ... }: 定义一个服务(虚拟主机)。 · listen: 指定服务器监听的端口(如 80)。 · server_name: 匹配请求的域名(如 example.com, www.example.com)。 · root: 设置请求的根目录,即网站文件存放的路径(如 /var/www/html)。 · index: 指定当请求目录时,默认查找的文件(如 index.html index.htm)。 · location [匹配模式] { ... }: 用于匹配特定的请求路径,并应用特定配置。
- 动手部署一个静态网站
· 操作步骤: 1. 创建网站目录和内容:
```bash # 创建一个新的网站根目录 sudo mkdir -p /var/www/my_project # 创建一个测试首页 sudo nano /var/www/my_project/index.html ``` 在 index.html 文件中写入以下内容并保存: ```html
Success! My custom site is running on NGINX.
``` 2. 创建虚拟主机配置文件: ```bash sudo nano /etc/nginx/sites-available/my_project ``` 写入以下配置: ```nginx server { listen 80; # 如果没有域名,可以用服务器IP访问,这里用 _ 表示通配 server_name _; # 设置我们刚刚创建的目录为根目录 root /var/www/my_project; index index.html;
location / {
# 尝试提供请求的文件,如果找不到则返回404
try_files uriuri/ =404;
}
}
```
- 启用站点: 在 sites-enabled 目录创建软链接。
```bash sudo ln -s /etc/nginx/sites-available/my_project /etc/nginx/sites-enabled/ ``` 4. 测试配置语法: ```bash sudo nginx -t ``` · 期望答案: 输出 syntax is ok 和 test is successful。 5. 重载NGINX配置: ```bash sudo systemctl reload nginx ``` 6. 验证: 再次在浏览器中访问你的服务器IP。 · 期望答案: 你现在应该看到 "Success! My custom site is running on NGINX." 而不是默认的欢迎页面。
第三步:核心功能进阶 - 反向代理与负载均衡
学习目标: 学会使用NGINX作为反向代理和负载均衡器,这是其最强大的功能之一。
- 实现反向代理
· 概念答案: 反向代理是NGINX站在后端服务器前面,代表它们接收客户端请求。客户端只知道NGINX的地址,不知道后端服务器的存在。这提供了安全性、抽象层和灵活性。 · 核心指令答案: proxy_pass · 实践操作: 假设你有一个Node.js应用运行在 http://localhost:3000。 1. 编辑配置文件:
```bash sudo nano /etc/nginx/sites-available/my_project ``` 2. 修改或添加 location 块: 我们将把所有以 /api/ 开头的请求转发给后端应用。 ```nginx server { listen 80; server_name _; root /var/www/my_project; index index.html;
# 处理静态文件
location / {
try_files uriuri/ =404;
}
# 反向代理配置:将所有/api/请求转发到后端应用
location /api/ {
# 最重要的指令,指定后端服务器地址
proxy_pass http://localhost:3000/;
# 设置一些重要的头信息,让后端应用获取真实的客户端信息
proxy_set_header Host host;
proxy_set_header X-Real-IPremote_addr;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protoscheme;
}
}
```
- 测试并重载:
```bash sudo nginx -t && sudo systemctl reload nginx ``` 4. 验证: 访问 http://your_server_ip/api/`,请求会被透明地转发到 localhost:3000`。
- 配置负载均衡
· 概念答案: 负载均衡是将流量分发到多个后端服务器的过程,以提高应用的可扩展性和可靠性。 · 核心指令答案: upstream · 负载均衡方法答案: · round-robin: 轮询(默认),依次将请求分发给每个服务器。 · least_conn: 将请求发送给当前连接数最少的服务器。 · ip_hash: 根据客户端IP地址的哈希值分配服务器,可以保证同一客户端的请求总是发给同一服务器(用于会话保持)。 · 实践操作: 假设你有三个后端应用服务器。 1. 在 http 块中定义 upstream 组: 编辑 /etc/nginx/nginx.conf 或在 sites-available 的配置文件中添加。
```nginx # 在http块内定义 http { # 定义一个名为 'backend_servers' 的上游组 upstream backend_servers { # 默认使用轮询策略 server 10.0.1.100:8080; server 10.0.1.101:8080; server 10.0.1.102:8080; # 可以设置权重,weight=2表示接收的请求是其他的两倍 # server 10.0.1.103:8080 weight=2; }
<pre><code> # ... 其他http配置 include /etc/nginx/sites-enabled/*; } ```
- 在 server 块中使用 upstream: 修改之前的反向代理配置。
```nginx location /api/ { # 使用 upstream 组的名字 proxy_pass http://backend_servers; proxy_set_header Host host; proxy_set_header X-Real-IPremote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` 3. 测试并重载。
第四步:性能优化与安全加固
学习目标: 学习关键的优化和安全配置,使你的NGINX服务器更快、更安全。
- 性能优化
· 答案与操作: · 启用Gzip压缩: 减小传输文件大小。
```nginx # 在http块中配置 gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ``` · 配置浏览器缓存: 对于静态资源,让浏览器本地缓存。 ```nginx # 在server或location块中配置 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 1y; # 告诉浏览器缓存1年 add_header Cache-Control "public, immutable"; } ``` · 设置代理缓存: 缓存后端动态内容。 ```nginx # 在http块中定义缓存路径 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; # 在location块中使用缓存 location /api/ { proxy_cache my_cache; proxy_pass http://backend_servers; # 对200和302状态码的响应缓存30分钟 proxy_cache_valid 200 302 30m; } ```
- 安全加固
· 答案与操作: · 隐藏NGINX版本号: 避免信息泄露。
```nginx # 在http块中配置 server_tokens off; ``` · 配置HTTPS/SSL: 使用Let's Encrypt免费证书。 · 这是一个较复杂的过程,通常使用 certbot 工具自动化完成。基本思路是: 1. 安装certbot。 2. 运行 sudo certbot --nginx 并按照提示操作。 3. Certbot会自动修改你的NGINX配置,设置重定向(HTTP到HTTPS)和SSL证书路径。 · 安全头部: 防范点击劫持、XSS等攻击。 ```nginx # 在server块中配置 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; ``` · 限制请求速率: 防止暴力破解和DDoS攻击。 ```nginx # 在http块中定义限制区域 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=1r/s; # 在特定的location中应用限制 location /api/login { limit_req zone=api_limit burst=5 nodelay; proxy_pass http://backend_servers; } ```
学习建议:
· 修改配置后,务必使用 sudo nginx -t 测试语法。 · 每次成功修改后,使用 sudo systemctl reload nginx 平滑重载配置,避免服务中断。 · 多查看日志: tail -f /var/log/nginx/error.log 和 tail -f /var/log/nginx/access.log 是你排错和了解请求情况的最佳朋友。
《nginx 学习手册》留言数:0