# Nginx面试常见问题(一):基础概念与架构
## 1. 什么是Nginx?它有哪些主要特性?
**答案:**
Nginx是一个高性能的开源Web服务器和反向代理服务器,由Igor Sysoev开发。它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名。
**主要特性:**
– 高性能:处理并发连接能力强
– 低资源消耗:内存占用小
– 高可靠性:稳定运行时间长
– 丰富的功能:反向代理、负载均衡、HTTP缓存等
– 可扩展性:支持模块扩展
– 跨平台:支持多种操作系统
– 配置简单:配置文件结构清晰
## 2. Nginx的架构是什么样的?
**答案:**
Nginx采用多进程架构,主要由以下组件组成:
– **master进程**:负责管理worker进程
– **worker进程**:处理实际的请求
– **cache loader进程**:加载缓存
– **cache manager进程**:管理缓存
**工作原理:**
– master进程负责启动、管理和监控worker进程
– worker进程是实际处理请求的进程,每个worker进程都是独立的,处理多个连接
– 采用事件驱动模型,使用epoll、kqueue等高效的I/O多路复用机制
– 每个worker进程可以同时处理数千个连接
## 3. Nginx的配置文件结构是什么样的?
**答案:**
Nginx的配置文件采用模块化结构,主要包括以下部分:
– **main块**:全局配置,影响整个Nginx服务
– **events块**:配置事件处理相关参数
– **http块**:配置HTTP服务器相关参数
– **server块**:配置虚拟主机
– **location块**:配置URL路径匹配规则
– **stream块**:配置TCP/UDP代理
**示例配置结构:**
“`nginx
# main块
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
# events块
events {
worker_connections 1024;
}
# http块
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# server块
server {
listen 80;
server_name example.com;
# location块
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
“`
## 4. Nginx的工作原理是什么?
**答案:**
Nginx的工作原理基于事件驱动模型,主要包括以下步骤:
1. **初始化阶段**:
– 解析配置文件
– 创建master进程
– master进程创建worker进程
2. **处理请求阶段**:
– worker进程监听端口
– 当请求到达时,worker进程通过事件驱动机制处理连接
– 使用epoll、kqueue等I/O多路复用技术处理多个连接
– 处理请求并返回响应
3. **负载均衡**:
– 当配置了负载均衡时,Nginx会将请求分发到后端服务器
– 支持多种负载均衡算法,如轮询、ip_hash、least_conn等
## 5. Nginx的反向代理是什么?它有什么作用?
**答案:**
反向代理是指Nginx作为代理服务器,接收客户端的请求,然后将请求转发到后端服务器,最后将后端服务器的响应返回给客户端。
**作用:**
– 隐藏后端服务器的真实IP地址
– 提高系统的安全性
– 实现负载均衡
– 缓存静态资源,提高性能
– 解决跨域问题
**配置示例:**
“`nginx
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;
}
“`
## 6. Nginx的负载均衡是什么?它支持哪些负载均衡算法?
**答案:**
负载均衡是指Nginx将请求分发到多个后端服务器,以提高系统的处理能力和可用性。
**支持的负载均衡算法:**
– **轮询(round-robin)**:默认算法,按顺序分发请求
– **ip_hash**:根据客户端IP地址哈希值分发请求,确保同一客户端的请求总是分发到同一服务器
– **least_conn**:将请求分发到当前连接数最少的服务器
– **weight**:加权轮询,根据服务器权重分发请求
– **fair**:根据服务器响应时间分发请求
**配置示例:**
“`nginx
upstream backend {
# 轮询
server backend1.example.com;
server backend2.example.com;
# ip_hash
# ip_hash;
# least_conn
# least_conn;
# weight
# server backend1.example.com weight=5;
# server backend2.example.com weight=1;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
“`
## 7. Nginx的静态文件处理能力如何?如何优化?
**答案:**
Nginx在处理静态文件方面表现出色,是其主要优势之一。
**优化策略:**
– 启用gzip压缩:减少传输数据量
– 启用浏览器缓存:设置合理的缓存头
– 使用sendfile:提高文件传输效率
– 调整缓冲区大小:优化I/O性能
– 使用open_file_cache:缓存文件描述符
**配置示例:**
“`nginx
http {
# gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control “public, max-age=2592000”;
}
# sendfile
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# open_file_cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
“`
## 8. Nginx的rewrite模块是什么?它有什么作用?
**答案:**
rewrite模块是Nginx的URL重写模块,用于修改请求的URL。
**作用:**
– URL重写:将请求重写到其他URL
– 重定向:将请求重定向到其他URL
– 实现友好的URL
– 处理旧URL的重定向
**配置示例:**
“`nginx
location /old {
# 重写到新路径
rewrite ^/old/(.*)$ /new/$1 last;
}
location /redirect {
# 301重定向
rewrite ^/redirect/(.*)$ http://example.com/new/$1 permanent;
}
“`
## 9. Nginx的安全配置有哪些?
**答案:**
Nginx的安全配置主要包括:
– **隐藏版本信息**:不向客户端暴露Nginx版本
– **限制请求方法**:只允许必要的HTTP方法
– **设置请求大小限制**:防止大请求攻击
– **限制并发连接**:防止DoS攻击
– **使用HTTPS**:加密传输
– **设置适当的HTTP头**:如X-Frame-Options、X-XSS-Protection等
– **防止目录遍历**:限制访问目录
**配置示例:**
“`nginx
# 隐藏版本信息
server_tokens off;
# 限制请求方法
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
# 设置请求大小限制
client_max_body_size 10m;
# 防止目录遍历
location ~ /\. {
deny all;
}
# 设置HTTP头
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection “1; mode=block”;
add_header Content-Security-Policy “default-src ‘self'”;
“`
## 10. Nginx与Apache的区别是什么?
**答案:**
Nginx与Apache的主要区别:
– **架构**:Nginx采用事件驱动模型,Apache采用多进程或多线程模型
– **性能**:Nginx处理并发连接能力更强,内存消耗更低
– **功能**:Apache模块更丰富,Nginx配置更简单
– **适用场景**:Nginx适合高并发场景,如静态文件服务、反向代理、负载均衡;Apache适合动态内容处理
– **配置**:Nginx配置文件结构更清晰,Apache配置更复杂
## 总结
本文介绍了Nginx面试中常见的基础概念与架构问题,包括Nginx的基本概念、主要特性、架构、配置文件结构、工作原理、反向代理、负载均衡、静态文件处理、rewrite模块、安全配置以及与Apache的区别等内容。掌握这些基础知识对于通过Nginx相关的技术面试至关重要。