nginx 笔记

151 阅读7分钟

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使用非阻塞的方式处理该事件
  • 响应客户端:返回相应
  • 重复事件监听:监听该连接的后续事件,并处理

chapter-2-1.png

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;                        # 缓存过期时间
    }

    
}