nginx基础介绍及示例配置

2023年 9月 23日 51.1k 0

什么是nginx

Nginx(发音为"engine-x")是一个开源的、高性能的HTTP和反向代理服务器,以及一个邮件代理服务器。它最初由Igor Sysoev创建,并于2004年首次发布。Nginx的主要特点包括:

  • 高性能:Nginx被设计为高并发、低内存消耗的服务器,能够处理大量的并发连接请求,适用于高流量网站和应用程序。
  • 反向代理:Nginx可以用作反向代理服务器,将客户端请求转发到后端的应用服务器,实现负载均衡、安全性和高可用性。
  • 静态文件服务:Nginx非常适合提供静态文件服务,如HTML、CSS、JavaScript和图像等,因为它能够快速地传送这些文件,减轻了应用服务器的负担。
  • 负载均衡:Nginx支持多种负载均衡算法,可以将客户端请求分发到多个后端服务器,以确保性能和可用性。
  • HTTP缓存:Nginx可以缓存静态内容和动态内容,提高网站性能,并减少后端服务器的负载。
  • SSL/TLS终端:Nginx支持SSL/TLS协议,用于加密数据传输,保护网站和应用程序的安全性。
  • 模块化架构:Nginx的功能可以通过模块进行扩展,用户可以根据需要添加或删除功能。
  • Nginx常用于构建高性能的Web服务器、反向代理服务器、负载均衡器和缓存服务器,广泛用于互联网、云计算和内部网络中,是一个非常流行的服务器软件,特别在处理高流量和大规模应用方面表现出色。

    nginx.jpg

    什么是反向代理?

    反向代理(Reverse Proxy)是一种网络服务器的部署模式,它充当了客户端和服务器之间的中间人。与正向代理不同,正向代理代表客户端向服务器请求服务,而反向代理代表服务器接收客户端的请求并将其转发到后端服务器,然后将后端服务器的响应返回给客户端。下面是反向代理的一些关键特点和用途:

  • 隐藏后端服务器:反向代理可以隐藏真实的后端服务器,客户端不直接与后端服务器通信。这有助于增加安全性,减少直接攻击后端服务器的风险,并防止攻击者获得有关服务器的敏感信息。
  • 负载均衡:反向代理可以分发客户端请求到多个后端服务器,以实现负载均衡。这可以确保请求被均匀地分配到不同的服务器上,提高了性能和可用性。
  • 缓存:反向代理可以缓存静态内容,例如图片、CSS、JavaScript等,以减轻后端服务器的负载,并提高响应速度。这有助于加速网站和应用程序的访问速度。
  • SSL终端:反向代理可以处理SSL/TLS协议,负责加密客户端和服务器之间的通信。这对于保护敏感数据和确保安全性至关重要。
  • Web加速:通过缓存和负载均衡,反向代理可以加速Web应用程序的性能,减少延迟,并提供更快的响应时间。
  • 安全性:反向代理可以实施安全策略,如访问控制、防火墙规则和DDoS(分布式拒绝服务)防护,以增强网络安全。
  • 日志记录:反向代理可以记录客户端和服务器之间的所有交互,用于监视和故障排除。
  • 反向代理充当了客户端和后端服务器之间的中间层,提供了一种有效的方式来管理流量、提高性能和安全性,并隐藏了后端服务器的复杂性和敏感信息。这使得反向代理在构建可扩展、高可用性和安全性的网络架构中起着重要作用。

    reverse-proxy.png

    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 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
     nginx -v            显示 nginx 的版本。
     nginx -V            显示 nginx 的版本,编译器版本和配置参数。
    

    nginx 配置

    Nginx的配置文件通常位于/etc/nginx/nginx.conf(在大多数Linux发行版中)或C:nginxconfnginx.conf(在Windows上),但也可以有其他位置,具体位置取决于你的系统和Nginx的安装方式。以下是Nginx配置的基本结构和示例:

    基本配置结构

    Nginx的配置文件采用块结构,包含http块、server块和location块。配置文件的主要部分如下:

  • http块:HTTP服务器的全局配置块,包括HTTP的一般设置和默认的server块。在这里定义的内容将适用于所有虚拟主机。
  • server块:每个虚拟主机的配置块。每个server块代表一个网站或Web应用程序。
  • location块:用于匹配特定URL路径的配置块。它允许你根据URL路径定制服务器的行为。
  • 示例配置文件

    以下是一个简单的Nginx配置文件示例,用于一个基本的静态网站

     #运行用户
     #user somebody;
     ​
     #启动进程,通常设置成和cpu的数量相等
     worker_processes  1;
     ​
     #全局错误日志
     error_log  /tools/nginx/logs/error.log;
     error_log  /tools/nginx/logs/notice.log  notice;
     error_log  /tools/nginx/logs/info.log  info;
     ​
     #PID文件,记录当前启动的nginx的进程ID
     pid        /tools/nginx/logs/nginx.pid;
     ​
     #工作模式及连接数上限
     events {
         worker_connections 1024;    #单个后台worker process进程的最大并发链接数
     }
     http {
         # 全局设置
         server_tokens off;  # 隐藏Nginx版本号
       
         #设定mime类型(邮件支持类型),类型由mime.types文件定义
         include       /tools/nginx/conf/mime.types;
         default_type  application/octet-stream;
     ​
         #设定日志
         log_format  main  '[$remote_addr] - [$remote_user] [$time_local] "$request" '
                           '$status $body_bytes_sent "$http_referer" '
                           '"$http_user_agent" "$http_x_forwarded_for"';
     ​
         access_log    /tools/nginx/logs/access.log main;
         rewrite_log     on;
     ​
         #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
         #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
         sendfile        on;
         #tcp_nopush     on;
     ​
         #连接超时时间
         keepalive_timeout  120;
         tcp_nodelay        on;
     ​
         #gzip压缩开关
         #gzip  on;
     ​
         # 默认的虚拟主机
         server {
             #错误处理页面(可选择性配置)
             error_page   404              /404.html;
             error_page   500 502 503 504  /50x.html;
             location = /50x.html {
                 root   html;
             }
             #监听80端口,80端口是知名端口号,用于HTTP协议
             listen 80;  # 监听端口
             server_name example.com www.example.com;  # 域名
     ​
             # 网站根目录
             root /var/www/html;
     ​
             # 默认文档
             index index.html;
     ​
             # 日志文件
             access_log /var/log/nginx/access.log;
             error_log /var/log/nginx/error.log;
     ​
             # 静态文件缓存
             location /static/ {
                 expires 30d;
             }
     ​
             # 处理动态请求
             location / {
                 proxy_pass http://backend_server;
             }
         }
        #HTTP服务器
         server {
             #监听443端口。443为知名端口号,主要用于HTTPS协议
             listen       443 ssl;
     ​
             #定义使用www.xx.com访问
             server_name  www.helloworld.com;
     ​
             #ssl证书文件位置(常见证书文件格式为:crt/pem)
             ssl_certificate      cert.pem;
             #ssl证书key位置
             ssl_certificate_key  cert.key;
     ​
             #ssl配置参数(选择性配置)
             ssl_session_cache    shared:SSL:1m;
             ssl_session_timeout  5m;
             #数字签名,此处使用MD5
             ssl_ciphers  HIGH:!aNULL:!MD5;
             ssl_prefer_server_ciphers  on;
     ​
             location / {
                 root   /root;
                 index  index.html index.htm;
             }
         }
     }
    

    负载均衡

    负载均衡(Load Balancing)是一种计算机网络技术,用于分发网络请求或工作负载到多个服务器或资源上,以确保这些服务器之间的负载分布均匀。这有助于提高系统的性能、可用性和可伸缩性,以应对高流量和大量请求的情况。

    负载均衡器(Load Balancer)是用于执行负载均衡的设备或软件组件。它接收来自客户端的请求,并将这些请求分发到一组后端服务器,每个后端服务器都能够处理请求并提供服务。以下是负载均衡的一些关键特点和优势:

  • 分布负载:负载均衡器将请求均匀地分发到多个后端服务器,避免了某一台服务器过载而其他服务器处于空闲状态的情况。这有助于充分利用服务器资源。
  • 高可用性:通过在多个服务器之间分发请求,如果某个服务器发生故障或不可用,负载均衡器可以自动将流量重新路由到其他健康的服务器上,确保服务的连续性。
  • 性能提升:负载均衡器可以根据服务器的性能和负载情况,动态调整请求的分发策略,以确保每个服务器都处于最佳工作状态,提高响应时间和吞吐量。
  • 水平扩展:通过添加更多的服务器,可以轻松扩展系统的处理能力,以适应不断增长的流量需求,而无需修改客户端的配置。
  • 故障隔离:负载均衡器可以检测到后端服务器的故障,并将请求路由到健康的服务器,从而降低了因服务器故障而导致的服务中断风险。
  • 安全性:一些负载均衡器提供了安全功能,如防火墙、DDoS攻击防护和SSL终端,以增强系统的安全性。
  • 会话保持:某些应用程序要求在一次会话中将客户端的请求路由到相同的后端服务器,以保持会话状态。负载均衡器可以实现会话保持功能。
  • 负载均衡可以在各种网络环境中使用,包括Web服务器、数据库服务器、应用服务器和存储系统。常见的负载均衡算法包括轮询(Round Robin)、加权轮询(Weighted Round Robin)、最少连接(Least Connections)和IP散列(IP Hash)等,这些算法可根据需求选择最合适的方式来分发请求。负载均衡是构建高可用性和高性能网络应用程序架构的重要组成部分。

    nginx-load-balance.png

    示例场景

    将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.xx.com,公网IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理(下面例子中使用的是加权轮询策略)。

    nginx.conf 配置如下:

     http {
          #设定mime类型,类型由mime.type文件定义
         include       /etc/nginx/mime.types;
         default_type  application/octet-stream;
         #设定日志格式
         access_log    /var/log/nginx/access.log;
     ​
         #设定负载均衡的服务器列表
         upstream load_balance_server {
             #weigth参数表示权值,权值越高被分配到的几率越大
             server 192.168.1.11:80   weight=5;
             server 192.168.1.12:80   weight=1;
             server 192.168.1.13:80   weight=6;
         }
     ​
        #HTTP服务器
        server {
             #侦听80端口
             listen       80;
     ​
             #定义使用www.xx.com访问
             server_name  www.xx.com;
     ​
             #对所有请求进行负载均衡请求
             location / {
                 root        /root;                 #定义服务器的默认网站根目录位置
                 index       index.html index.htm;  #定义首页索引文件的名称
                 proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表
     ​
                 #以下是一些反向代理的配置(可选择性配置)
                 #proxy_redirect off;
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
                 proxy_set_header X-Forwarded-For $remote_addr;
                 proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
                 proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
                 proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
                 proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                 proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
                 proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
                 proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传
     ​
                 client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
                 client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
             }
         }
     }
    

    负载均衡策略

    Nginx 提供了多种负载均衡策略

    轮询

     upstream bck_testing_01 {
       # 默认所有服务器权重为 1
       server 192.168.250.220:8080
       server 192.168.250.221:8080
       server 192.168.250.222:8080
     }
    

    加权轮询

     upstream bck_testing_01 {
       server 192.168.250.220:8080              weight=3
       server 192.168.250.221:8080              # default weight=1
       server 192.168.250.222:8080              # default weight=1
     }
    

    最少连接

     upstream bck_testing_01 {
       least_conn;
     ​
       # with default weight for all (weight=1)
       server 192.168.250.220:8080
       server 192.168.250.221:8080
       server 192.168.250.222:8080
     }
    

    加权最少连接

     upstream bck_testing_01 {
       least_conn;
     ​
       server 192.168.250.220:8080   weight=3
       server 192.168.250.221:8080              # default weight=1
       server 192.168.250.222:8080              # default weight=1
     }
    

    IP Hash

     upstream bck_testing_01 {
     ​
       ip_hash;
     ​
       # with default weight for all (weight=1)
       server 192.168.250.220:8080
       server 192.168.250.221:8080
       server 192.168.250.222:8080
     ​
     }
    

    普通 Hash

     upstream bck_testing_01 {
     ​
       hash $request_uri;
     ​
       # with default weight for all (weight=1)
       server 192.168.250.220:8080
       server 192.168.250.221:8080
       server 192.168.250.222:8080
     ​
     }
    

    配置文件实例及内容介绍

     #定义 nginx 运行的用户和用户组
     user www www;
     ​
     #nginx 进程数,建议设置为等于 CPU 总核心数。
     worker_processes 8;
     ​
     #nginx 默认没有开启利用多核 CPU, 通过增加 worker_cpu_affinity 配置参数来充分利用多核 CPU 以下是 8 核的配置参数
     worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
     ​
     #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
     error_log /var/log/nginx/error.log info;
     ​
     #进程文件
     pid /var/run/nginx.pid;
     ​
     #一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。
     worker_rlimit_nofile 65535;
     ​
     #工作模式与连接数上限
     events
     {
         #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。
         #epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式,但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
         use epoll;
     ​
         ############################################################################
         #单个后台 worker process 进程的最大并发链接数
         #事件模块指令,定义 nginx 每个进程最大连接数,默认 1024。最大客户连接数由 worker_processes 和 worker_connections 决定
         #即 max_client=worker_processes*worker_connections, 在作为反向代理时:max_client=worker_processes*worker_connections / 4
         worker_connections 65535;
         ############################################################################
     }
     ​
     #设定 http 服务器
     http {
         include mime.types; #文件扩展名与文件类型映射表
         default_type application/octet-stream; #默认文件类型
         #charset utf-8; #默认编码
     ​
         server_names_hash_bucket_size 128; #服务器名字的 hash 表大小
         client_header_buffer_size 32k; #上传文件大小限制
         large_client_header_buffers 4 64k; #设定请求缓
         client_max_body_size 8m; #设定请求缓
         sendfile on; #开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off。
         autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
         tcp_nopush on; #防止网络阻塞
         tcp_nodelay on; #防止网络阻塞
     ​
         ##连接客户端超时时间各种参数设置##
         keepalive_timeout  120;          #单位是秒,客户端连接时时间,超时之后服务器端自动关闭该连接 如果 nginx 守护进程在这个等待的时间里,一直没有收到浏览发过来 http 请求,则关闭这个 http 连接
         client_header_timeout 10;        #客户端请求头的超时时间
         client_body_timeout 10;          #客户端请求主体超时时间
         reset_timedout_connection on;    #告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间
         send_timeout 10;                 #客户端响应超时时间,在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接
         ################################
     ​
         #FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
         fastcgi_connect_timeout 300;
         fastcgi_send_timeout 300;
         fastcgi_read_timeout 300;
         fastcgi_buffer_size 64k;
         fastcgi_buffers 4 64k;
         fastcgi_busy_buffers_size 128k;
         fastcgi_temp_file_write_size 128k;
     ​
         ###作为代理缓存服务器设置#######
         ###先写到 temp 再移动到 cache
         #proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=cache_one:512m inactive=10m max_size=64m;
         ###以上 proxy_temp 和 proxy_cache 需要在同一个分区中
         ###levels=1:2 表示缓存级别,表示缓存目录的第一级目录是 1 个字符,第二级目录是 2 个字符 keys_zone=cache_one:128m 缓存空间起名为 cache_one 大小为 512m
         ###max_size=64m 表示单个文件超过 128m 就不缓存了  inactive=10m 表示缓存的数据,10 分钟内没有被访问过就删除
         #########end####################
     ​
         #####对传输文件压缩###########
         #gzip 模块设置
         gzip on; #开启 gzip 压缩输出
         gzip_min_length 1k; #最小压缩文件大小
         gzip_buffers 4 16k; #压缩缓冲区
         gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
         gzip_comp_level 2; #压缩等级,gzip 压缩比,1 为最小,处理最快;9 为压缩比最大,处理最慢,传输速度最快,也最消耗 CPU;
         gzip_types text/plain application/x-javascript text/css application/xml;
         #压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。
         gzip_vary on;
         ##############################
     ​
         #limit_zone crawler $binary_remote_addr 10m; #开启限制 IP 连接数的时候需要使用
     ​
         upstream blog.abc.com {
             #upstream 的负载均衡,weight 是权重,可以根据机器配置定义权重。weigth 参数表示权值,权值越高被分配到的几率越大。
             server 192.168.80.121:80 weight=3;
             server 192.168.80.122:80 weight=2;
             server 192.168.80.123:80 weight=3;
         }
     ​
         #虚拟主机的配置
         server {
             #监听端口
             listen 80;
     ​
             #############https##################
             #listen 443 ssl;
             #ssl_certificate /opt/https/xxxxxx.crt;
             #ssl_certificate_key /opt/https/xxxxxx.key;
             #ssl_protocols SSLv3 TLSv1;
             #ssl_ciphers HIGH:!ADH:!EXPORT57:RC4+RSA:+MEDIUM;
             #ssl_prefer_server_ciphers on;
             #ssl_session_cache shared:SSL:2m;
             #ssl_session_timeout 5m;
             ####################################end
     ​
             #域名可以有多个,用空格隔开
             server_name www.abc.com abc.com;
             index index.html index.htm index.php;
             root /data/www/abc;
             location ~ .*.(php|php5)?$ {
                 fastcgi_pass 127.0.0.1:9000;
                 fastcgi_index index.php;
                 include fastcgi.conf;
             }
     ​
             #图片缓存时间设置
             location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
                 expires 10d;
             }
     ​
             #JS 和 CSS 缓存时间设置
             location ~ .*.(js|css)?$ {
                 expires 1h;
             }
     ​
             #日志格式设定
             log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
     ​
             #定义本虚拟主机的访问日志
             access_log /var/log/nginx/abcaccess.log access;
     ​
             #对 "/" 启用反向代理
             location / {
                 proxy_pass http://127.0.0.1:88;
                 proxy_redirect off;
                 proxy_set_header X-Real-IP $remote_addr;
                 #后端的 Web 服务器可以通过 X-Forwarded-For 获取用户真实 IP
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 #以下是一些反向代理的配置,可选。
                 proxy_set_header Host $host;
                 client_max_body_size 10m; #允许客户端请求的最大单文件字节数
                 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
     ​
                 ##代理设置 以下设置是 nginx 和后端服务器之间通讯的设置##
                 proxy_connect_timeout 90; #nginx 跟后端服务器连接超时时间(代理连接超时)
                 proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
                 proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
                 proxy_buffering on;    #该指令开启从后端被代理服务器的响应内容缓冲 此参数开启后 proxy_buffers 和 proxy_busy_buffers_size 参数才会起作用
                 proxy_buffer_size 4k;  #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                 proxy_buffers 4 32k;   #proxy_buffers 缓冲区,网页平均在 32k 以下的设置
                 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
                 proxy_max_temp_file_size 2048m; #默认 1024m, 该指令用于设置当网页内容大于 proxy_buffers 时,临时文件大小的最大值。如果文件大于这个值,它将从 upstream 服务器同步地传递请求,而不是缓冲到磁盘
                 proxy_temp_file_write_size 512k; 这是当被代理服务器的响应过大时 nginx 一次性写入临时文件的数据量。
                 proxy_temp_path  /var/tmp/nginx/proxy_temp;    ##定义缓冲存储目录,之前必须要先手动创建此目录
                 proxy_headers_hash_max_size 51200;
                 proxy_headers_hash_bucket_size 6400;
                 #######################################################
             }
     ​
             #设定查看 nginx 状态的地址
             location /nginxStatus {
                 stub_status on;
                 access_log on;
                 auth_basic "nginxStatus";
                 auth_basic_user_file conf/htpasswd;
                 #htpasswd 文件的内容可以用 apache 提供的 htpasswd 工具来产生。
             }
     ​
             #本地动静分离反向代理配置
             #所有 jsp 的页面均交由 tomcat 或 resin 处理
             location ~ .(jsp|jspx|do)?$ {
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_pass http://127.0.0.1:8080;
             }
     ​
             #所有静态文件由 nginx 直接读取不经过 tomcat 或 resin
             location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
             { expires 15d; }
     ​
             location ~ .*.(js|css)?$
             { expires 1h; }
         }
     }
    

    防盗链

    防盗链(Hotlink Protection)是一种用于保护你的网站资源(如图片、视频、音频等)不被其他网站或第三方站点盗用的技术。Nginx可以通过配置来实现防盗链功能,以确保只有经过授权的站点或用户可以访问你的资源。

     location ~ .(jpg|jpeg|png|gif|mp3|mp4|flv)$ {
         valid_referers none blocked example.com *.example.com;
         if ($invalid_referer) {
             return 403;
         }
     }
    
  • location块:该配置应该放在适当的location块中,以匹配你想要防盗链的资源类型(在上面的示例中,是图片和多媒体文件)。
  • valid_referers:指定哪些来源是合法的。在示例中,none表示不允许任何来源,blocked表示直接拒绝所有请求,example.com*.example.com表示允许来自example.com及其子域名的请求。你可以根据需要自定义这个列表,添加允许的合法来源。
  • if ($invalid_referer):如果请求的来源不在允许的列表中,这个条件将为真。在这种情况下,服务器将返回HTTP状态码403(禁止访问),拒绝盗链请求。
  • 需要注意的是,这种简单的防盗链方法是基于HTTP请求头中的"Referer"字段。然而,客户端可以伪造Referer头,因此这并不是一种绝对安全的方法。要增强安全性,你可以考虑使用其他方式,如签名URL、令牌验证等。

    此外,防盗链可能会对正常用户造成一些不便,因为某些浏览器或代理可能不会发送Referer头,或者Referer头可能会被隐私浏览模式禁用。因此,在实施防盗链时,需要权衡安全性和用户体验之间的权衡。

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论