深入掌握Nginx服务器

前言

本文介绍nginx服务器及其主要特性,首先给出了包管理器安装及编译安装两种方式,然后重点对nginx配置文件中的指令及参数进行详细说明,在了解nginx的工作方式后,从nginx实现请求访问控制(IP、带宽、连接数限制及参数校验)、反向代理、跨域请求、负载均衡策略(轮询、权重、IP哈希、最少连接数)、缓存方式及配置SSL证书提供Https访问方面进行详细说明

Nginx简介

Nginx (发音 engine x)是一个高性能的 HTTP 和反向代理服务器、 IMAP/POP3 代理服务器、邮件代理服务器和通用的TCP/UDP代理服务器,最初由俄罗斯一个名叫伊戈尔·西索耶夫(Igor Sysoev)的工程师用C语言开发并在2004年公开发布,2011年成立了一个名为nginx公司的提供了相应支持及其付费软件nginx plus

nginx主要特性

  • 高并发连接处理能力:事件驱动和非阻塞I/O的工作方式,内存占用率低,并且可采用多进程方式工作,能够处理数万甚至数十万的并发连接

  • 高效率处理静态网页:通过文件缓存、内存读取的方式提供静态内容(如图像、CSS、HTML等)快速响应

  • 强大的反向代理Nginx的反向代理是作为一个代理服务器,接收客户端请求,然后将这些请求转发个一个或多个后端服务器处理,最终将结果返回给客户端,客户端并不知道后端服务器的存在,只与反向代理服务器通讯,这个过程代理服务器还可以缓存http请求

  • 多种负载均衡策略Nginx提供了多种负载均衡算法(如轮询、权重、最少连接数优先、IP哈希等),对后端服务集群可有效分配流量以改善整体性能

  • 请求过滤和正则匹配:支持进行一系列过滤,如处理内容压缩(gzip)、字节限制、图像转换等;支持对请求路径匹配支持采用正则表达式

  • 灵活的访问控制:校验客户端源地址、根据不同的客户端IP执行不同的功能,限制请求连接数及响应速率,并且对访问的请求进行日志记录

  • SSL/TLS 协议支持:Nginx提供了SSL/TLS协议支持,确保网络通讯是安全和加密的;SSLSecure Sockets Layer)和 TLSTransport Layer Security)是用于在客户端和服务器之间建立加密连接的协议,TLSSSL 的后续版本,提供了更强的安全性

    HTTPS (HyperText Transfer Protocol Secure)是 HTTP(Hypertext Transfer Protocol,超文本传输协议) 协议的安全版本,HTTP 协议规定了客户端(例如浏览器)和服务器之间的请求和响应的标准格式和行为,而HTTPS 使用 SSL/TLS 来加密 HTTP 请求和响应,确保数据在传输过程中不会被窃取或篡改

通过包管理器安装nginx

Ubuntu20中可以使用包管理器aptapt-get命令安装比较简便、快捷、可靠,apt 自动处理软件包的下载、依赖解析、安装和配置,使得用户无需了解软件包的编译和依赖关系即可轻松安装和使用软件;但包管理器安装相比编译安装也会一些缺点,如版本滞后,由于使用了默认配置,因此自定义选项有限

包管理器aptapt-getapt-cache 的高层次封装,旨在简化用户的操作并改进输出格式,使其更友好和易于理解,apt 命令的输出更加简洁和美观,带有颜色和进度条

只需简单几条命令即可安装:

# 安装nginx
sudo apt install nginx
# 启动nginx,安装之后会被加入systemctl服务中
systemctl start nginx
# 查看nginx,可看到包管理器安装好nginx会自动创建一个systemd文件:/lib/systemd/system/nginx.service
systemctl status nginx
 # 重新加载nginx配置
systemctl reload nginx 
# 查看当前nginx版本
nginx -v 
# 显示:nginx version: nginx/1.18.0 (Ubuntu)

查看nginx信息

# 查看apt安装了哪些nginx包
apt list --installed |grep nginx

# 查看nginx相关路径,其中默认配置文件为:/etc/nginx/nginx.conf
# whereis 用于查找命令的可执行文件、源代码和手册页的位置,它直接从系统的预定义目录中查找文件,而不依赖于环境变量 PATH
whereis nginx

# 使用which可查找和显示可执行程序的路径, 该命令只会查找在 PATH 环境变量中定义的路径下的可执行文件
which nginx  
# 显示: /usr/sbin/nginx

# 查看系统范围内的环境变量的文件
 cat /etc/environment
 # 显示如下内容,可以发现apt安装时将nginx可执行文件放置到 /usr/bin目录在PATH路径中,因此可以路径上下文中使用 nginx命令
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"

编译安装nginx

采用编译安装的方式,可灵活定制需要的模块功能、可获得最新版的特性、优化性能;但操作相对复杂,需要自己解决相关依赖,维护成本高,不同系统和环境下编译的结果可能不一致

Nginx下载的官方地址:nginx: download

用官方提供的最新的稳定版本nginx-1.26.1,将其解压并编译安装到ubuntu 20中为例:

1.下载Nginx包

# 解压文件,-v 显示命令执行详细信息,-x 解压缩文件,-f 指定文件
tar -vxf nginx-1.26.1.tar.gz
# 查看目录
cd nginx-1.26.1 && ls
# auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
# 为了可视化查看目录结构,可以安装一个工具:sudo apt install tree 
sudo ./configure
# 执行这个配置命令,会自动检查依赖情况,提示需要以下库 :
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.


# 用以下命令先安装上述缺少的 PCRE库、zlib库
 sudo apt-get install libpcre3 libpcre3-dev
 sudo apt-get install zlib1g zlib1g-dev

2.配置nginx路径

#  再次执行配置命令
 sudo ./configure
 # 执行命令结束,最后几显示了NGINX 的配置脚本的一个摘要,它提供了有关 NGINX 安装的关键信息,包括使用的库、路径和文件位置):
 creating objs/Makefile

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"  # nginx安装的根目录
  nginx binary file: "/usr/local/nginx/sbin/nginx"  # nginx主程序,运行这个文件可以来启动nginx
  nginx modules path: "/usr/local/nginx/modules"  # nginx模块存放路径
  nginx configuration prefix: "/usr/local/nginx/conf"  # nginx配置文件的目录
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"  # 配置文件全路径
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"  # nginx主进程ID文件路径
  nginx error log file: "/usr/local/nginx/logs/error.log"  # 错误日志文件 
  nginx http access log file: "/usr/local/nginx/logs/access.log"  # 访问日志文件,存储所有访问记录
  nginx http client request body temporary files: "client_body_temp"  # 客户端请求体临时文件目录
  nginx http proxy temporary files: "proxy_temp"  # 代理文件临时目录
  nginx http fastcgi temporary files: "fastcgi_temp"  
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

上述配置路径若想要自定义,在官方文档(Building nginx from Sources),可以找到configure命令支持的配置参数,以下是一些常见的配置参数:

configure --help  # 查看支持的选择等信息
–-prefix=path  # 指定nginx安装目录,默认为/user/local/nginx
--sbin-path=path  # 指定nginx可执行文件,默认为 prefix /sbin/nginx
--conf-path=path  # 指定配置文件,默认为prefix/conf/nginx.conf,如有需要还可以在ngixn启动时用命令行参数 -c file 来指定
–-pid-path=path  # 指向nginx主进程pid,默认为 prefix /logs/nginx.pid,可在nginx.conf中用pid指令配置
–-lock-path=path  # 锁定安装文件,默认为prefix/logs/nginx.lock,可在nginx.conf用lock_file指令配置
–-error-log-path=path  # 错误日志,默认为prefix /logs/access.log,可在nginx.conf中使用error_log指令配置
–-http-log-path=path  # 指定http主要请求日志的文件,安装后可在nginx.conf配置文件中使用 access_log指令配置
–-http-client-body-temp-path=path  # 设定客户端请求的临时目录,同nginx.conf中proxy_temp_path指令
–-http-proxy-temp-path=path # 用于存储从代理服务器接收数据的临时文件目录
–-http-fastcgi-temp-path=path  # 设定fastcgi临时目录
–-http-uwsgi-temp-path=path  # 设定uwsgi临时目录
–-http-scgi-temp-path=path # 设定scgi临时目录

--with-cc=path  # 设置C文件编译器路径
--with-cpp=path # 设置cpp文件编译器路径
–-with-http_gzip_static_module   # 启用gzip模块,默认没有启用,启用后将用".gz"格式压缩常规文件
--with-stream_ssl_module  # 启用SSL/TLS协议支持,该模块默认没有构建,如有使用https协议需要该模块支持
--without-http-cache  # 禁用http缓存
--with-mail=dynamic  # 启用 POP3/IMAP4/SMTP 邮箱代理服务器
--without-pcre  # 禁用PCRE库
--with-pcre # 启用PCRE库

修改配置示例:

sudo ./configure \
    --sbin-path=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf \
    --pid-path=/usr/local/nginx/nginx.pid \
    --with-http_ssl_module 

执行上述示例命令时提示ssl模块需要依赖:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

可执行以下命令安装OpenSSL库及其开发包:

sudo apt-get install libssl-dev

3.编译和安装nginx

# 编译nginx代码,生成文档文件
sudo make

# 安装 nginx
sudo make install

# 上述命令执行过程中可看到会自动执行类似下面的创建目标目录、备份移动命令:
#  test -d '/usr/local/nginx' || mkdir -p '/usr/local/nginx'  
#  test ! -f '/usr/local/nginx/nginx' || mv '/usr/local/nginx/nginx' '/usr/local/nginx/nginx.old'

4.启动nginx

# 启动nginx主程序,--sbin-path 指定的目录或默认
sudo /usr/local/nginx/nginx

# 验证,如有看到响应html内容 Welcome to nginx! 说明已经正常工作了
curl localhost

Nginx管理命令

启动nginx后,可以使用以下指令

 nginx -s stop  # 快速关闭 nginx
 nginx -s quit  # 正常关闭(优雅关闭),关闭前让工作进程处理完当前请求
 nginx -s reload  # 重新加载配置,修改配置文件时,需用该命令向ngixn主进程发送信号让配置生效
 
 ps -ax | grep nginx  # 查看nginx进程列表
sudo kill -s quit 31151  # 也可以通过kill命令正常关闭nginx,其中 31151 是nginx的主进程(master process)ID ,只有杀死nginx主进程才能停止

nginx配置文件

nginx配置文件由模块组成,而模块可由指令配置,指令可分为简单指令和块指令

简单指令:以名称和参数组成,两者之间以空格分隔,并以分号;结尾

块指令:以大括号{}包围,大括号内可包含其他指令(如events,http,server,location)

配置文件中位于#所在行之后的内容被视为注释

以下是一个常见的配置文件nginx.conf

user www-data;  # 典型的Linux系统用户,通常用于运行网络服务,语法:user user [group]
worker_processes auto;  # 启动的工作进程数量,以为具体数字,最佳值取决于cup内核数、存储硬盘数、负载模式,取值为auto表示自动根据可用CUP内核数确定
pid /run/nginx.pid;  # 用于存储主进程ID
include /etc/nginx/modules-enabled/*.conf;  # 包含的额外配置文件,其内容将会被导入到当前配置中

events {   # 提供处理连接的上下文
        worker_connections 768;  # 每个工作进程的最大连接数
        # multi_accept on;
        # use epoll;  # use指令配置连接处理的方法,通常不需要显示指定,nginx默认使用最有效的方法,默认用epoll
}

http {  # 提供处理http服务器配置的上下文
        # Basic Settings
        sendfile on;  # 启用静态文件传输优化
        tcp_nopush on;  # 启用TCP数据包发送优化,以完整超数据包发送文件
        tcp_nodelay on;  # 启用以减少延迟,连接转换到keep-alive状态、SSL、非缓冲和WebSocket代理上启用
        keepalive_timeout 65;  # 客户端无活动请求时连接在65秒后断开,若设置较长会占用服务器资源
        types_hash_max_size 2048;  # 设置哈希表最大为2048项,设置适当值可优化查找性能
        # server_tokens off;  # 控制是否在 HTTP 响应头和错误页面中显示 Nginx 的版本号
        # server_names_hash_bucket_size 64;  # 哈希表中服务器名称的桶大小
        # server_name_in_redirect off;  # 重定向时不使用server_name指定的主机名,而用请求头中Host,若不存在则用服务器的IP地址
        include /etc/nginx/mime.types;  # 指定MIME类型文件,包含了文件扩展名与MIME类映射关系
        default_type application/octet-stream;  # 默认MIME类型,当无法根据文件扩展名找到对应类型则使用此默认值,这是一种通用二进制流MIME类型
        # SSL Settings
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;  # 指定 Nginx 支持的 SSL/TLS 协议版本
        ssl_prefer_server_ciphers on;  # 在协商加密算法时优先使用服务器的加密算法顺序,而不是客户端的顺序
        # Logging Settings
        access_log /var/log/nginx/access.log;  # 客户端请求的日志文件
        error_log /var/log/nginx/error.log;  # 错误日志文件
        # 可使用log_format指定一些自定义的日志格式
        # log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
        # Gzip Settings
        gzip on;  # 启用gzip压缩,对文本内容(如HTML、CSS等)压缩可减少传输数据大小以减少带宽
        gzip_min_length 1024;  # 指定最小压缩,小于1024字节的文件不会被压缩
        # gzip_vary on;  # 用于在 HTTP 响应头中添加 Vary: Accept-Encoding 字段
        # gzip_proxied any;  # 指定在何种情况下对通过代理的请求启用 gzip 压缩
        # gzip_comp_level 6; # 设置响应的 gzip 压缩级别,可接受的值在1(最低压缩)到9(最高压缩)之间
        # gzip_buffers 16 8k;  # 存储 gzip 压缩数据的缓冲区数量和大小
        # gzip_http_version 1.1;  # 启用 gzip 压缩的最低 HTTP 版本
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  # 指定哪些 MIME 类型的响应内容应该启用 gzip 压缩

        # 虚拟主机配置
        include /etc/nginx/conf.d/*.conf;  # 导入的配置
        # include /etc/nginx/sites-enabled/*;  # 导入的配置文件内容,默认为 /etc/nginx/sites-enabled/default,里面的内容为server块,可以有多个,如下:
        server {  # 虚拟服务器配置
            listen 80 default_server;  # 默认的服务器,default_server表示当其他server块都不匹配时会只用此配置
            listen [::]:80 default_server;  # 监听所有 IPv6 地址上的 80 端口
            root /var/www/html; # location块没有root指令时,将使用该root指定的目录
            # Add index.php to the list if you are using PHP
            index index.html index.htm index.nginx-debian.html; # 默认的首页文件
            server_name _;  #  server_name 为 _ 这表示匹配所有请求,通常用于默认服务器

            location / {  # 请求uri配置
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
            }
        }
        # 还可以继续添加多个server配置虚拟主机 
        server {
        	listen 8000;  
        	server_name localhost;  # server_name 可指定多个并以空格分隔,还可以是正则表达式如 
        	location /resources {  # 请求 http://localhost:8000/resources/index.html
        	                       # 匹配文件:/var/www/resources/index.html
        	    root /var/www;     # root指令设置请求的根目录
        	    index index.html;  
        	}
        }
      
}

#mail {   # 邮件服务器指令相关配置
# 参考:https://nginx.org/en/docs/mail/ngx_mail_core_module.html
#}

nginx工作方式

nginx 基于事件驱动和非阻塞 I/O来高效处理并发请求,nginx运行是一个主进程和多个工作进程的方式

事件驱动和非阻塞IO:不会为每个请求创建新线程或进程,而是采用非阻塞I/O等待网络操作(读取或写入数据)时可以继续处理其他任务,然后通过事件循环检查是否有网络I/O操作完成,并处理完成的请求和响应

主进程和工作进程:主机进程(master process)用于启动、管理和控制工作进程,监听处理配置文件加载,执行进程的启动停止;工作进程(worker process)用于客户端的请求和响应、网络I/O,以及配置文件中定义的请求处理处理逻辑(如代理、负载均衡、静态文件服务等)

以下是正在运行中的nginx进程:

ps -ax|grep nginx
   1459 ?        Ss     0:01 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
 207578 ?        S      0:00 nginx: worker process
 222773 pts/2    S+     0:00 grep --color=auto nginx

请求基本流程:工作进程监听客户端请求,根据配置文件中内容处理请求;若配置了反向代理,则会将请求转发到目标服务器处理,目标服务器处理完后会将响应数据返回给nginx,然后nginx再响应结果给客户端;若配置了多个服务器的负载均衡策略,则将请求分派到不同目标服务器;若是请求静态文件,工作进程直接从磁盘读取文件返回给客户端

nginx配置

访问控制

IP地址访问控制

location /protected/ {
    allow 192.168.58.88;  # 允许指定的客户端ip来访问
    deny all;  # 拒绝其他ip
}

map指令应用

map 指令可以用来根据请求的主机头(Host header)来设置变量,然后根据这些变量进行条件控制,适用于需要复杂条件的情况

http {
    map $host $allowed {  
        default 0;
        example.com 1;
        www.example.com 1;
    }
    server {
        listen 80;
        location / {
            if ($allowed = 0) { # 由map配置的参数决定
                return 403;
            }
        }
    }
}

路径重写与参数校验

以下实现的效果: curl http://192.168.58.111:8000/static/index.html?token=123只有携带指定参数才允许被访问

        location /protected {
        		if ($arg_token != "123") { # 取url的参数token,若不匹配则禁止访问
        			return 403;
        		}
                internal;  # internal指令阻止直接访问 /protected,仅能被内部重写访问,不能外部直接访问
                alias /var/www/resources; # alias指令用于将特定 URI 映射到一个文件系统路径,并将uri路径替换为指定的路径;如请求 /protected/index.html时,将去匹配到 /var/www/resources/index.html
                # root /var/www/resources; # root指令设置一个根路径,并将uri路径作为结合的一部分;如请求 /protected/index.html 将去匹配 /var/www/resources/protected/index.html
        }

        location /static {
                rewrite ^/static/(.*)$ /protected/$1 last;  # 正则表达式匹,如请求 /static/index.html将会补获$1为index.html,重写为 /protected/index.html,此时将会匹配上面的location块
                # last 标志表示重写后重新评估请求,允许继续匹配其他 location 块
                # 如果 last 被替换为 break,则只会在当前 location 块中处理,不再继续匹配其他块
        }

请求限流

以下配置实现一个请求限流,每秒最多处理1个请求,一次最多只允许一个ip地址连接

limit_req_zone $binary_remote_addr zone=resource_one:10m rate=1r/s; # 为连接状态分配在10MB内存,平均处理速率每秒不超过1个请求
limit_conn_zone $binary_remote_addr zone=resource_addr:10m; # 为resource_addr分配10MB的内存,存储连接状态信息

server {
        listen 8000;
        server_name localhost;
        location /resources {
        	    limit_rate 10k;   # 限制带宽,每秒限制下载速度为 10 KB
                limit_req zone=resource_one burst=5 nodelay;  # 使用上述指定的resource_one, 每秒不超1个请求,突发请求不超过5个;默认超出的请求会被延迟, 若不希望请求受限是延迟过多请求,可添加参数nodelay;
                limit_conn resource_addr 1; # 一次只允许一个ip地址有一个链接
                root /var/www;
                index index.html;
        }
}        

反向代理

允许将请求传递到另一个服务器

location /api { 
   # 请求 http://192.168.58.111:8000/api/hello将会请求后端服务器 http://192.168.58.59:8080/hello
    proxy_pass       http://192.168.58.59:8080;  #  设置代理服务器的协议、地址及映射位置
    proxy_set_header Host      $host;  # 将当前nginx所在的主机信息加到请求头,可后端服务器某些场景会用到
    proxy_set_header X-Real-IP $remote_addr;  # 将发送请求的客户端ip地址加到请求头
}

跨域请求

跨域请求:在一个网页中,尝试从一个域(origin)请求资源或数据,而这个域与当前网页所在的域不同(不同的协议、域名或端口号)

出于安全原因,浏览器默认对跨域请求有限制,可通过nginx服务器配置允许跨域请求访问

server {
        listen 8000;
        server_name localhost;
        #允许跨域请求的域,*代表允许所有源访问,可指定具体值如:'http://127.0.0.1:5500'
        add_header 'Access-Control-Allow-Origin' *;
        #允许带上cookie请求
        add_header 'Access-Control-Allow-Credentials' 'true';
        #允许请求的方法,可以为符号*,或具体指定如 'GET,POST,PUT,DELETE,OPTIONS'
        add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,OPTIONS';
        #允许请求的header, 符号*表示不限制,也具体指定如: 'Origin, X-Requested-With, Content-Type, Accept'
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';

        location /resources {
                root /var/www;
                index index.html;
        }
        # 正则表达式匹配以 .jpg, jpeg等结尾的资源
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            root /var/www/resources;
        }
}

负载均衡

Nginx支持多种负载均衡策略,可根据不同需要在upstream上下文中设置,常见以下几种:轮询、权重、IP哈希、最少连接数

轮询(Round Robin)

Nginx的默认策略,会依次按一定顺序请求不同的服务器

upstream http_bakend {  # 上游服务器(后端服务器)配置
        # max_fails设置允许失败的最大次数为3次,fail_timeout指定在30秒内达到最大失败次数则标记为不可用
        server 192.168.58.111:8000 max_fails=3 fail_timeout=30s;
        server 192.168.58.194:8001; 
        keepalive 16; # 设置每个工作进程最多保持16个与后端服务器的持久连接,设置合适值可减少连接建立和断开的开销
}
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        # root /var/www/html;
        # index index.html index.htm index.nginx-debian.html;
        server_name _;
        location / {
                proxy_pass http://http_bakend;
                proxy_http_version 1.1;  # 确保版本设置为1.1
                proxy_set_header Connection "";  # 参考官方文档,此处需把Connection请求头置空
        }
}

权重(Weight)

为每个服务器设置权重,权重越高,服务器处理的请求就越多

upstream http_bakend {
        server 192.168.58.111:8000 weight=2;  
        server 192.168.58.194:8001 weight=1;
}

IP哈希(IP Hash)

将相同的客户端 IP 分配到同一台后端服务器,常用于会话保持

upstream http_bakend {
        ip_hash; 
        server 192.168.58.111:8000;
        server 192.168.58.194:8001;
        keepalive 16; # 保持连接数
}

最少连接数(Least Connections)

将请求分配到当前连接数最少的服务器上

upstream backend {
    least_conn;
    server 192.168.58.111:8000;
    server 192.168.58.194:8001;
}

缓存配置

浏览器端的静态资源缓存

nginx中可使用expires设置 HTTP 响应头中的 ExpiresCache-Control 头部,从而控制客户端浏览器或代理服务器缓存响应的时间

常用来指定静态资源(如图片、css、JavaScript文件)在客户端的缓存时间,在有效期内,浏览器会从本地缓存中加载资源

浏览器在缓存过期或检测到资源可能已更改时,会发送一个条件请求,带有 If-Modified-SinceIf-None-Match 头部,nginx 会判断文件的 Last-Modified 时间或 ETag :若未更新则返回304 Not Modified,不会发送资源的完整内容,浏览器会继续使用缓存中的版本;若已更新则服务器返回 200 OK 状态码,并且重新发送文件的完整内容

   location ~* \.(jpg|jpeg|png|gif|ico|css|js|html)$ {
            root /var/www/resources;
            expires 30s;  # 浏览器端收到资源后缓存30秒
            # access_log off; # 可关闭访问日志记录
   }

nginx反向代理缓存

可通过配置proxy_cache相关指令来启用或关闭缓存功能

# /var/cache/nginx  缓存路径,不存在则会被创建
# levels=1:2 表示缓存目录会创建两层子目录。第一层有一个字符的子目录,第二层有两个字符的子目录
# keys_zone=app_cache:10m 定义一个名为`app_cache`的内存共享区域大小为10MB
# max_size=1g 缓存的最大总大小为 1GB,超过此值自动清理最早项
# inactive=1m 不被访问的情况下缓存数据的存活时间,设置为30分钟
# use_temp_path=off 不使用临时路径
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:10m max_size=1g inactive=30m use_temp_path=off;
server {
        listen 8000;
        server_name localhost;
        
        location /api {
                proxy_cache app_cache;  # 指定上述定义的缓存,keys_zone指定的名称
                # proxy_cache off;  # 禁用之前配置级别继承的缓存
                proxy_cache_valid 200 302 304 15m;  # 当后端服务器返回 HTTP 状态码为 200(成功)或 302(临时重定向)或304(客户端缓存的资源是最新的)时,缓存的有效期为 15 分钟,该15分钟内请求命中则直接使用缓存响应;若缓存超过15分钟,缓存项标记为过期,当请求再次到达,nginx向后端发出请求获取响应,并更新缓存
                proxy_cache_valid 404 1m;  # 后端返回状态码404,缓存1分钟
                proxy_cache_key "$scheme$request_method$host$request_uri";  # 可选,设置缓存键
                proxy_pass http://192.168.58.59:8080;  # 代理的后端服务器
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }
}

配置SSL证书支持https访问

1.SSL模块支持

确保nginx编译时是否包含了ssl模块,ubuntu 20中使用apt安装nginx默认编译了该模块

nginx -V 2>&1 | grep -- '--with-http_ssl_module'
# 若有输出,说明已经存在了ssl模块,若没有则需要在编译时指定对于选项

生产环境的SSL证书需通过域名向公认的证书颁发机构获取

2.SSL证书获取

以下验证nginxSSL配置,仅用于开发、测试环境,可使用openssl命令在本地生成一个自签名的SSL证书(浏览器或其他客户端如 curl默认会认为这些证书不可信)

# 用openssl命令生成自签名的SSL/TLS证书,参数:
# -x509: 表示生成自签名证书而不是证书签名请求;
# -nodes: 表示生成的私钥不会被加密(无密码保护),以便于自动化使用;
# -days 365: 证书的有效期为 365 天;
# -newkey rsa:2048: 生成一个新的 RSA 私钥,密钥长度为 2048 位;
# -keyout 生成的私钥文件的路径;-out 生成的证书文件的路径
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt


# 通过使用 -subj 参数,可以避免手动输入这些信息,直接生成包含指定主题信息的自签名证书
sudo openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/C=zh/ST=fz/L=fz/O=Internet Widgits Pty Ltd/CN=devp.com"

 # -subj 指定证书的主题信息,格式是 /C=country/ST=state/L=locality/O=organization/CN=commonname 以下为例:
 # /C=zh: 国家代码(例如 zh 表示中国);
 # /ST=fz: 省份或州的名称(例如 fz 表示福州)
 # /L=fz: 城市或地区的名称(例如 fz 表示福州)
 # /O=Internet Widgits Pty Ltd: 组织的名称(例如 Internet Widgits Pty Ltd)
 # /CN=devp.com 常用名称(例如 devp.com,通常是服务器的域名)

3.nginx配置SSL证书

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    keepalive_timeout   70;  # 70秒内,如果没有新的请求,服务器会关闭连接
    server_name devp.com www.devp.com;  # 域名
    ssl_session_timeout  5m;  # 会话缓存的超时时间为 5 分钟,有效期内可重用之前会话,不需要进行完整握手
    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;  # ssl证书文件路径
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;  # SSL 证书配套的私钥文件路径
    ssl_session_cache   shared:SSL:10m;  # 启用 SSL 会话缓存,并设置缓存大小为 10MB
    ssl_protocols TLSv1.2 TLSv1.3;  # 支持的 SSL/TLS 协议版本,TLS 1.3 是最新版本,具有更好的安全性和性能
    ssl_prefer_server_ciphers on;  # 取值on则优先使用服务器配置的加密套件,而不是客户端支持的加密套件
    ssl_ciphers HIGH:!aNULL:!MD5;  # 服务器支持的加密通信的算法组合,其他算法如 AES128-SHA:AES256-SHA

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

4.验证https请求

# 检查配置文件语法是否正确
sudo nginx -t
# 重启nginx
sudo nginx -s reload
# curl命令验证请求
# 使用 curl 的 -k 或 --insecure 选项来忽略 SSL 证书验证
curl -k https://devp.com/
# 注意修改 /etc/hosts文件添加(192.168.58.111为nginx所在服务的IP):
# 192.168.58.111 devp.com www.devp.com

参考资料

nginx官方文档

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值