汇总了在工作中遇到的各种 Nginx 使用场景,对这篇文章进行了细致的整理和层次分明的讲解,旨在提供简洁而深入的内容。希望这能为你提供帮助和启发! 对于前端开发人员来说,Node.js 是一种熟悉的技术。虽然 Nginx 和 Node.js 在某些理念上有相似之处,比如都支持 HTTP 服务、事件驱动和异步非阻塞操作,但两者并不冲突,各有各自擅长的领域: Nginx:擅长处理底层的服务器端资源,如静态资源处理、反向代理和负载均衡。 Node.js:更擅长处理上层的具体业务逻辑。
而两者的结合可以实现更加高效和强大的应用服务架构,下面我们就来看一下。
一、Nginx 是什么?
Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯程序员Igor Sysoev于 2004 年使用 C 语言开发。它最初设计是为了应对俄罗斯大型门户网站的高流量挑战。
二、反向代理是什么?
让我们先从代理说起。Nginx 常被用作反向代理,那么什么是正向代理呢?
正向代理:客户端知道要访问的服务器地址,但服务器只知道请求来自某个代理,而不清楚具体的客户端。正向代理隐藏了真实客户端的信息。例如,当无法直接访问国外网站时,我们通过代理服务器访问特定网址。
反向代理:多个客户端向反向代理服务器发送请求,Nginx 根据一定的规则将请求转发至不同的服务器。客户端不知道具体请求将被转发至哪台服务器,反向代理隐藏了后端服务器的信息。
三、Nginx 的核心特性
Nginx包含以下七个核心特性,使它成为处理高并发和大数据量请求的理想选择:
- 事件驱动:Nginx采用高效的异步事件模型,利用 I/O 多路复用技术。这种模型使 Nginx 能在占用最小内存的同时处理大量并发连接。
- 高度可扩展:Nginx能够支持数千乃至数万个并发连接,非常适合大型网站和高并发应用。例如:为不同的虚拟主机设置不同的 worker 进程数,以增加并发处理能力 http { worker_processes auto; # 根据系统CPU核心数自动设置worker进程数 }
- 轻量级:相较于传统的基于进程的Web服务器(如Apache),Nginx的内存占用更低,得益于其事件驱动模型,每个连接只占用极小的内存空间。
- 热部署:Nginx支持热部署功能,允许在不重启服务器的情况下更新配置和模块。例如:在修改了 Nginx 配置文件后,可以快速热部署 Nginx 配置:sh代码解读复制代码sudo nginx -s reload
- 负载均衡:Nginx内置负载均衡功能,通过upstream模块实现客户端请求在多个后端服务器间的分配,从而提高服务的整体处理能力。以下是一个简单的upstream配置,它将请求轮询分配到三个后端服务器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend; # 将请求转发到upstream定义的backend组
}
}
- 高性能:Nginx 在多项 Web 性能测试中表现卓越,能快速处理静态文件、索引文件及代理请求。比如:配置 Nginx 作为反向代理服务器,为大型静态文件下载服务: location /files/ { alias /path/to/files/; # 设置实际文件存储路径 expires 30d; # 设置文件过期时间为30天 }
- 安全性:Nginx支持SSL/TLS协议,能够作为安全的Web服务器或反向代理使用。
server {
listen 443 ssl;
ssl_certificate /path/to/fullchain.pem; # 证书路径
ssl_certificate_key /path/to/privatekey.pem; # 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议
}
四、搭建 Nginx 服务
如何安装Nginx?在 Linux 系统中,可以使用包管理器来安装 Nginx。例如,在基于 Debian 的系统上,可以使用 apt :
sudo apt update
sudo apt install nginx
在基于 Red Hat 的系统上,可以使用 yum 或 dnf:
sudo yum install epel-release
sudo yum install nginx
在安装完成后,通常可以通过以下命令启动 Nginx 服务:
sudo systemctl start nginx
# 或设置开机自启动:
sudo systemctl enable nginx
启动成功后,在浏览器输入服务器 ip 地址或者域名,如果看到 Nginx 的默认欢迎页面,说明 Nginx 运行成功。
五、常用命令
以下是一些常用的 Nginx 脚本命令,这些脚本通常用于 Bash 环境下:
# 启动 Nginx:
nginx
# 停止 Nginx:
nginx -s stop
# 重新加载 Nginx:
nginx -s reload
# 检查 Nginx 配置文件(检查配置文件的正确性):
nginx -t
# 查看 Nginx 版本:
nginx -v
其他常用的配合脚本命令:
# 查看进程命令:
ps -ef | grep nginx
# 查看日志,在logs目录下输入指令:
more access.log
六、配置文件构成
主要由以下几部分构成:全局块、HTTP 块、Server 块、Location 块。
全局块(Global Block)
全局块位于 Nginx 配置文件的顶部,它包含影响整个 Nginx 服务器的设置。通常,这里会配置用户和工作进程数量等信息。
# 使用哪个用户和用户组来运行 Nginx 服务
user nginx;
# 自动检测 CPU 核心数,并根据核心数设置工作进程数。
worker_processes auto;
# 指定存储 Nginx 进程 ID 的文件位置。
pid /var/run/nginx.pid;
# 设置错误日志的路径和日志记录的级别(例如 `warn` 表示警告级别)。
error_log /var/log/nginx/error.log warn;
# worker_connections定义每个worker进程可以同时打开的最大连接数
events {
worker_connections 1024;
}
HTTP 块(HTTP Block)
HTTP 块包含了与 HTTP 服务相关的配置。这里可以定义多种 Server 块、日志设置、全局 HTTP 选项等。
http {
# 定义使用的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 指定访问日志的路径,并使用自定义的日志格式 `main`。
access_log /var/log/nginx/access.log main;
# 引入 MIME 类型配置文件,以便正确地为不同文件类型设置 Content-Type
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 设置客户端保持连接的超时时间为 65 秒
keepalive_timeout 65;
# 开启 gzip 压缩,以减少传输数据的体积
gzip on;
}
Server 块(Server Block)
Server 块用于定义虚拟主机,每个 Server 块对应一个网站或服务。在这里可以配置域名、监听端口以及与此域名相关的特定设置。
server {
# 监听 80 端口,这通常是 HTTP 默认的端口
listen 80;
# 定义服务器的域名,可以指定多个别名
server_name example.com www.example.com;
# 指定网站的根目录
root /var/www/example;
# 定义默认首页文件,当用户请求根路径时会加载这些文件
index index.html index.htm;
# 指定自定义的 404 错误页面
error_page 404 /404.html;
# 为该服务器定义专用的访问日志
access_log /var/log/nginx/example_access.log main;
# 处理根路径的请求,这里使用 `try_files` 尝试匹配文件或目录,如果无法匹配则返回 404
location / {
try_files $uri $uri/ =404;
}
# 为 `/images/` 路径下的静态资源配置缓存策略,让这些资源在客户端缓存 30 天
location /images/ {
expires 30d;
}
}
Location 块(Location Block)
Location 块用于匹配客户端请求的 URL 路径,并根据匹配结果执行特定的配置。Location 块可以包含在 Server 块中,也可以嵌套在其他 Location 块中。
location / {
# 尝试查找文件或目录,若找不到则返回404
try_files $uri $uri/ =404;
}
location /images/ {
# 设置静态文件的缓存时间
expires 30d;
}
location /api/ {
# 反向代理,将请求转发到其他服务器
proxy_pass http://backend_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;
}
location /
:默认的路径匹配,用于处理根路径请求。location /images/
:匹配所有/images/
开头的请求,主要用于处理静态资源。location /api/
:匹配所有/api/
开头的请求,并将这些请求反向代理到后端服务器http://backend_server
。