nginx 介绍
高性能的web服务器和反向代理服务器
反向代理:
网络代理服务,代理客户端向服务端发送请求,并且将服务端的相应转发给客户端。客户端不知道它与代理服务器进行通信。而正向代理,客户端知道它与服务器通信,(隐藏用户ip,绕过访问限制)
- 负载均衡
向代理可以将客户端的请求分发给多个后端服务器,从而实现负载均衡。 避免单个服务器因为过载而导致性能下降
- 缓存
反向代理可以缓存服务器响应,将经常请求的资源缓存起来,当下次有相同请求时,直接返回缓存的响应,避免重复处理相同的请求,提高响应速度。
原理:当客户端发送请求到反向代理服务器时,反向代理会根据预先配置的规则,将请求转发给后端的真实服务器。后端服务器处理请求,并将响应返回给反向代理,然后再由反向代理将响应返回给客户端。客户端并不知道实际处理请求的是哪个后端服务器,它只与反向代理进行通信。
基本架构
Master进程
nginx的主进程,负责nginx的启动关闭,重载配置等,管理其他工作进程
工作进程(Worker)
Master进程会创建多个工作进程(独立进程),负责处理客户端的请求,该进程是事件驱动的,通过
异步非阻塞的方式来处理请求,这样单个进程中可以同时处理多个连接,实现高并发。
事件模块
负责处理客户端连接事件(接收新的连接 接收客户端请求数据) Nginx支持多种操作系统的事件机制,例如select、poll、epoll(Linux特有)、kqueue(FreeBSD、macOS特有)
select:这是一种基本且广泛支持的事件机制。它通过监视一组文件描述符的读、写或异常事件来工作。但它不够可扩展,因为需要扫描所有文件描述符,对于大规模应用来说效率较低。
poll:类似于 select,但更具可扩展性。它能够更好地处理大量文件描述符。它会监视一组文件描述符,并等待事件发生。
epoll:这是特定于 Linux 系统的事件机制,非常高效和可扩展。它采用事件驱动的方式,并设计用于高效处理大量连接。epoll 在性能上优于 select 和 poll,尤其在高并发场景下表现出色。
kqueue:这是特定于 FreeBSD、macOS 和其他 BSD 系统的事件通知机制。类似于 epoll,kqueue 是一个高效的 I/O 事件处理机制。像 epoll 一样,kqueue 也能高效处理大量连接
原理
nginx的主进程和工作进程都是单线程的,它们通过事件模块监听客户端
连接的到来和后续的读写事件。当事件发生时,立刻处理该事件,非等待或者阻塞其他请求处理。事件模型的一般流程
- 初始化:创建多个工作进程,并且初始化事件模块
- 监听端口:根据配置监听相应的端口
- 接收连接: 客户端发送请求时,事件模块通知主进程或者工作进程有新连接
- 分配连接:将连接分配给空闲的工作进程
- 异步处理:当有读写的事件发送时,nginx使用非阻塞的方式处理该事件
- 响应客户端:返回相应
- 重复事件监听:监听该连接的后续事件,并处理
nginx 基础配置
配置文件
全局块
主要用于设置运行Nginx服务器的用户、worker process数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
user root; # 用于配置用户或者用户组
worker_processes 8; # nginx服务器work进程数(建议为服务器核心的倍数)
error_log /logs/error.log; # 错误日志路径
pid /nginx.pid; # Nginx主进程的PID文件的存放路径。PID文件用于记录Nginx主进程的进程ID,方便其他程序与Nginx进行交互。
worker_connections 1024; # 每个work进程同时处理的最大连接数
worker_rlimit_nofile 6666; # 进程可以打开的最大描述符
event
event块主要配置与连接相关的参数。涉及
事件模型和并发连接设置
worker_connections 1024; # 每个work进程同时处理的最大连接数(会覆盖全局块的配置)
use epoll; # 选择使用的事件的驱动模型
multi_accept on; # 同时接收多个连接。当有多个连接时,同时接收而非一个个接收
accept_mutex on; # 防止多个进程竞争接收同一个连接
keepalive_timeout: 60; # keepalive的超时时间
open_file_cache max=65535 inactive=60s; # 打开文件缓冲大小 max数量 inactive多久后删除缓存
open_file_cache_valid 80s # 多久检查一次缓存的有效性
open_file_cache_errors on; # 记录文件搜索时cache的错误
http块
用于配置http服务器,可以配置多个
server块,每一个server块代表着一个虚拟主机(服务块),用于处理不同的网站或者应用
http {
# 配置全局参数
include /etc/nginx/mine.type # MIME类型
log.format main ''; # 日志格式
access_log /var/access.log main; # 配置访问日志路径和格式
error_page 404 /404.html; # 404 页面
error_page 500 502 /50x.html # 50x页面
server_names_hash_bucket_size 64; # 设置服务器名的哈希桶大小
default_type application/oct-stream ; # 设置默认的MIME文件类型
charset utf-8; # 默认编码
client_header_buffer_size 1k; # 请求头缓冲区大小
large_client_header_buffers 64k; # 超出client_header_buffer_size,使用本配置缓存header
client_max_body_size 8M; # 缓存请求体的大小
sendfile on; # 使用启用高效文件传输方式,普通应用on,磁盘下载重IO可以off
autoindex on; # 开启列表访问 适合下载服务器,默认关闭
#gzip 模块配置
gzip on; # 开启gzip压缩输出
gzip_min_length 1k; # 最小压缩文件
gzip_buffer 16k; # 压缩缓冲区大小
gzip_http_version 1.0; # 压缩版本
gzip_comp_levels 2; # 压缩等级
gzip_type text/plain application/x-javascript text/css application/xml;
# 压缩类型(默认包含text/html)
gzip_vary on; # 启用gzip压缩
# 负载均衡
upstream www.xxxxgdc.com {}
server{} # 配置服务
}
server 块
server {
listen 80; # 监听接口
server_nam www.helloworld.com ; # 服务名称(域名),可以配置多个,空格隔开
index index.html; # 配置默认返回文件
root /data/www.gdc.com; # 配置服务器根目录
# 负载均衡
# 缓存
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 10d; # 图片缓存时间
}
location · .*.(js|css)?$ {
expires 1h # js,css文件按缓存时间
}
access_log # 主机的访问日志
# 反向代理
location / { # 对/启用反向代理
proxy_pass http://10.6.6.6:66; # 代理地址
proxy_redirect: [from] [to]; # 代理重定向 form要替换的字符,to替换字符
set_proxy_header x_real_IP $remote_ip; # 设置代理http请求头(如将客户端真实ip作为代理请求头)
client_max_body_size 10M; # 允许的最大请求体大小
client_body_buffer_size 10M; # 请求体的缓冲区大小
proxy_intercept_errors on; # 阻止错误相应
proxy_connect_timeout 60s; # 代理连接超时
proxy_send_timeout 60s; # 代理响应发送超时
proxy_read_timeout 60s; # 代理等待后端响应超时
proxy_buffer_size 128k; # 代理缓冲区大小
proxy_temp_file_write_size 64k; # 设置写入临时文件的大小,大于则上传
}
}
nginx 安装
linux
-
apt 安装
apt install nginx -
编译安装
- 安装编译依赖
apt install build-essential - 下载nginx 源码
wget http://nginx.org/download/nginx-x.x.x.tar.gz - 解压
tar -xvf, 进入目录 - 配置编译参数,生成makefile文件
./configure --ngx_http_sub_module(部分模块需要安装其他依赖,如openssl,zlib,prce) - 编译
make - 安装
make install
- 安装编译依赖
nginx 常用命令
- 启动
nginx - 关闭
nginx -s stop - 重新加载配置文件
nginx -s reload - 测试配置文件是否正确
nginx -t
简单的静态服务器的搭建
server {
listen 8082;
server_name localhost; # 域名
root /mnt/c/web/data; # 服务器根目录
location / { # 静态资源文件
autoindex on; # 允许自动索引, nginx 生成目录
autoindex_exact_size off; # 关闭精确大小(字节)以kb等显示
autoindex_localtime on; # 显示修改时间
# 访问权限
allow 127.0.0.1;
allow 10.0.3.79;
deny all;
}
location ~./*(png|jpg|jpeg|gif|webm) { # 缓存图片
expires 10d; # 缓存过期时间
}
}