Nginx 学习总结

蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。

导航

  • [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 配置在线生成器

相关推荐
HLC++15 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室16 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy19 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕19 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫20 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生21 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.111 天前
linux基础IO
linux·运维·服务器
BelongPanda1 天前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯1 天前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998341 天前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器