如何高效学习Nginx并总结其核心知识点?

摘要:蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。 导航 1 工具介绍 2 配置结构 3 模块指令 4 应用场景 4.1 Web 服务器 4.2 文件服务器 4.3 反向代理 4.4 负载均衡 4.5 FastCGI 4.6 四层代理 5
蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。 导航 1 工具介绍 2 配置结构 3 模块指令 4 应用场景 4.1 Web 服务器 4.2 文件服务器 4.3 反向代理 4.4 负载均衡 4.5 FastCGI 4.6 四层代理 5 杂七杂八 1、工具介绍 Nginx 是一款轻量级的 Web 服务器、反向代理服务器、邮件代理服务器,它的出现完美地解决了“传统 Web 服务器在高并发连接下性能不足”的问题。 而相比于 Apache 这个老牌对手,它最大的优势便是高并发、内存占用少,除此之外在文档完善方面和模块丰富方面,它还是不及 Apache。 2、配置结构 Nginx 默认的配置文件只需一个 /etc/nginx/nginx.conf 文件即可,但一些 Linux 发行商为了方便参数维护,故一般会对其进行分割以形成模块化结构的配置文件,如下面的 Debian 系统:【注意:不同发行版的模块化结构各有所不同。】 /etc/nginx ├── nginx.conf #主配置的入口点 ├── conf.d/ #可在 HTTP 区域内配置的参数,亦可在此处单独添加配置 ├── mime.types ├── sites-available/ #可用的虚拟主机 ├── sites-enabled/ #启用的虚拟主机 ├── modules-available/ #可用的模块配置 ├── modules-enabled/ #启用的模块配置 ├── snippets/ #启用 SSL 证书 上面介绍了配置文件的目录结构,下面则介绍 nginx.conf 文件整体的用法结构: # Nginx 全局配置区域 events { #Event 全局配置区域 } http { # HTTP 全局配置区域 upstream backend { #代理池区域 } server { # 虚拟主机全局配置区域 location / { # URI 路由配置区域 } } } stream { # 流代理全局配置(基于 TCP 四层的代理) upstream backend { #代理池区域 } server { # 代理主机全局配置区域 } } 注意:在 Nginx 的配置文件中,http、stream 块指令只能存在一次,不能像 server 那样可以同时存在多个。 3、模块指令 Nginx 最核心的设计之一就是它的模块体系,几乎所有功能都是由模块提供的。可以理解成:Nginx 本体很小,功能全靠模块拼装。 通常我们把常用模块分成 核心模块、HTTP 模块、Stream 模块 三类来看最清晰。 核心模块 Core functionality:提供 Nginx 最基本的功能,即上述 Nginx 全局配置区域 的指令。 HTTP 模块 ngx_http_core_module:提供 HTTP 服务最 基本 的功能。【相关指令:listen、server、location、root】 ngx_http_ssl_module:为 HTTP 服务提供 传输加密 的功能。【相关指令:listen 443 ssl】 ngx_http_index_module:为 HTTP 服务提供 默认页面加载 的功能。【相关指令:index】 ngx_http_rewrite_module:为 HTTP 服务提供 链接重定向 的功能。【相关指令:if、rewrite、return】 ngx_http_access_module:为 HTTP 服务提供 访问日志记录 的功能。【相关指令:access_log、log_format。注意,该模块不包括错误日志记录的功能,该功能属于 Nginx Core 模块的功能,而非 HTTP Core 模块。】 ngx_http_auth_basic_module:为 HTTP 服务提供 基本身份认证 的功能。【相关指令:auth_basic】 ngx_http_access_module:为 HTTP 服务提供 基于 IP 的访问控制 功能。【相关指令:deny、allow】 ngx_http_geoip_module:为 HTTP 服务提供 基于城市的访问控制 功能,但需配合 rewrite 模块实现。【相关指令:geoip_country、geoip_city,该模块提供更多的其实是一些变量。】 ngx_http_limit_conn_module:为 HTTP 服务提供 限制并发连接 的功能,以保护多线程下载时引发的带宽问题。【相关指令:limit_conn、limit_conn_zone,以 Web 为主,推荐值 10 个;若以文件下载为主,推荐值 5 个。】 ngx_http_limit_req_module:为 HTTP 服务提供 限制请求速率 的功能,以防止 CC 攻击。【相关指令:limit_req、limit_req_zone,推荐值 10r/s】 ngx_http_stub_status_module:为 HTTP 服务提供 请求状态统计页面 的功能。【相关指令:stub_status】 ngx_http_autoindex_module:为 HTTP 服务提供 文件服务器 的功能。【相关指令:autoindex】 ngx_http_proxy_module:为 HTTP 服务提供 反向代理 的功能。【相关指令:proxy_pass】 ngx_http_upstream_module:为 HTTP 服务提供 负载均衡 的功能。【相关指令:upstream】 ngx_http_fastcgi_module:为 HTTP 服务提供 支持 FastCGI 协议 的功能。【相关指令:fastcgi_pass、fastcgi_index】 Stream 模块 ngx_stream_core_module:提供 TCP/UDP 流量代理服务最 基本 的功能。【相关指令:stream】 ngx_stream_proxy_module:为 Stream 服务提供 反向代理 的功能。【相关指令:proxy_pass】 其它模块与上面为 HTTP 提供的模块功能类似,故此处不再赘述。 4、应用场景 以下 Nginx 的各种使用场景中,提供的参数信息仅为能实现功能所需的最基本要求,忽略了更多的参数配置、以及模块加载配置。 4.1、Web 服务器 (1)在一个虚拟主机下,开设不同的网页功能。 #在一个虚拟主机下,开设不同的网页功能。【即,路由匹配功能】 http { #...... server { listen 80; server_name www.test.com; location / { root /var/www/html; index index.html; } location /test2 { root /var/www/html2; index index.html; } } } (2)创建了两个虚拟主机,需分别使用不同的域名进行访问。 #创建了两个虚拟主机,需分别使用不同的域名进行访问。 http { #...... server { listen 80; server_name www.test.com; location / { root /var/www/html; index index.html; } } server { listen 8080; server_name www.test2.com; location / { root /var/www/html2; index index.html; } } } (3)开启 HTTPS 服务,以及 HTTP 重定向至 HTTPS 服务。 #开启 HTTPS 服务,以及 HTTP 重定向至 HTTPS 服务。 http { #...... server { listen 443 ssl; server_name www.test.com; #证书通过 make-ssl-snake 命令去制作会更方便,起码在实验环境下这是可行的。 ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; location / { root /var/www/html; index index.html; } } server { listen 80; server_name .test.com; #此处的匹配方式颇有讲究,如 *.test.com 和 .test.com 效果大不相同。 location / { return 301 https://www.test.com$request_uri; } } } 4.2、文件服务器 http { autoindex on;# 显示目录 autoindex_exact_size on;# 显示文件大小 autoindex_localtime on;# 显示文件时间 server { listen 80; root /var/www; } } 4.3、反向代理 http { #...... server { listen 80; server_name www.test.com; location / { proxy_pass http://www.test2.com; } } } 4.4、负载均衡 http { #...... upstream load_balance_server { #weigth参数表示权值,权值越高被分配到的几率越大 server 192.168.1.11:80 weight=1; server 192.168.1.12:80 weight=2; server 192.168.1.13:80 weight=3; } server { listen 80; server_name www.test.com; location / { proxy_pass http://load_balance_server; } } } 注:(1)负载均衡支持的策略有:轮询、加权、Hash,权重相同即为轮询,均来自同一个主机的请求则均发往相同的服务器即为 Hash。(2)负载均衡其实和反向代理非常像,区别仅在于负载均衡必须要有代理池,即 upstream 指令。 4.5、FastCGI 暂待 4.6、四层代理 #实现 SSH 代理转发 stream { upstream tcp_proxy { hash $remote_addr consistent; #远程地址做个hash server 1.1.1.1:22; } server { listen 2222; proxy_pass tcp_proxy; } } 5、杂七杂八 (1)Nginx 常用命令。 nginx -s stop 快速关闭 Nginx,可能不保存相关信息,并迅速终止 web 服务。 nginx -s quit 平稳关闭 Nginx,保存相关信息,有安排的结束 web 服务。 nginx -s reload 因改变了 Nginx 相关配置,需要重新加载配置而重载。 nginx -s reopen 重新打开日志文件。 nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。 nginx -t 不运行,仅仅测试配置文件。 nginx -T 不运行,仅将 Nginx 启动时所加载的所有配置、模块等信息全部显示出来。 nginx -v 显示 nginx 的版本。 nginx -V 显示 nginx 的版本,编译器版本和编译时的配置参数。 (2)Nginx 模块管理。 nginx -V 输出的模块信息中:(1)--with-compat 表示该 nginx 主体程序支持动态加载模块,否则就是纯静态编译版本;(2)--with-*_module 代表将该模块编译进 nginx 主体程序;(3)--with-*_module = dynamic 代表将模块编译为动态模块,而不是直接编进主程序,启用它需要手动加载。 nginx -T 能够看到 nginx 在运行时的配置情况,加载了哪些模块都能够准确的看到;而通过 nginx -V 是无法看到当前加载的模块信息的,它只能看到当初编译 nginx 时使用的命令参数。 apt search libnginx-mod- 能够搜索到 APT 软件仓库都提供了哪些 nginx 动态模块,如有需要可随时下载,以便使用。 (3)Nginx 的 Stream 功能平时用的较少,但他实际上和 HAProxy 的功能类似,都是为了实现 TCP/UDP 四层的流量代理转发功能。 (4)Nginx 参考手册:Nginx 中文文档、Nginx 极简教程、Nginx 中文手册、二丫讲梵。 (5)辅助工具:Nginx 配置在线生成器。