蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。
导航
- [1 工具介绍](#1 工具介绍)
- [2 配置结构](#2 配置结构)
- [3 模块指令](#3 模块指令)
- [4 应用场景](#4 应用场景)
- [4.1 Web 服务器](#4.1 Web 服务器)
- [4.2 文件服务器](#4.2 文件服务器)
- [4.3 反向代理](#4.3 反向代理)
- [4.4 负载均衡](#4.4 负载均衡)
- [4.5 FastCGI](#4.5 FastCGI)
- [4.6 四层代理](#4.6 四层代理)
- [5 杂七杂八](#5 杂七杂八)
1、工具介绍
Nginx 是一款轻量级的 Web 服务器、反向代理服务器、邮件代理服务器,它的出现完美地解决了"传统 Web 服务器在高并发连接下性能不足"的问题。
而相比于 Apache 这个老牌对手,它最大的优势便是高并发、内存占用少,除此之外在文档完善方面和模块丰富方面,它还是不及 Apache。
2、配置结构
Nginx 默认的配置文件只需一个 /etc/nginx/nginx.conf 文件即可,但一些 Linux 发行商为了方便参数维护,故一般会对其进行分割以形成模块化结构的配置文件,如下面的 Debian 系统:【注意:不同发行版的模块化结构各有所不同。】
bash
/etc/nginx
├── nginx.conf #主配置的入口点
├── conf.d/ #可在 HTTP 区域内配置的参数,亦可在此处单独添加配置
├── mime.types
├── sites-available/ #可用的虚拟主机
├── sites-enabled/ #启用的虚拟主机
├── modules-available/ #可用的模块配置
├── modules-enabled/ #启用的模块配置
├── snippets/ #启用 SSL 证书
上面介绍了配置文件的目录结构,下面则介绍 nginx.conf 文件整体的用法结构:
nginx
# 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)在一个虚拟主机下,开设不同的网页功能。
nginx
#在一个虚拟主机下,开设不同的网页功能。【即,路由匹配功能】
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)创建了两个虚拟主机,需分别使用不同的域名进行访问。
nginx
#创建了两个虚拟主机,需分别使用不同的域名进行访问。
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 服务。
nginx
#开启 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、文件服务器
nginx
http {
autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间
server {
listen 80;
root /var/www;
}
}
4.3、反向代理
nginx
http {
#......
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://www.test2.com;
}
}
}
4.4、负载均衡
nginx
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、四层代理
nginx
#实现 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 常用命令。
bash
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 配置在线生成器。