ActiveMQ Python爬虫实战 d3 jestjs Material UI vue图表 vue基础教程 网赚教程下载 微信小游戏开发视频 angular视频 大数据项目开发案例 mysql在线测试 bentley软件介绍 git下载代码到本地命令 python连接mysql python创建txt文件并写入 python创建对象 python语言编程 python中不等于 python正则替换 python搭建网站 python加入环境变量 python安装程序 java的map java创建文件 java原始数据类型 javasocket 冬青鼠 两表关联查询 刺激战场脚本 方正兰亭字体下载 如何给黑白照片上色 数组删除指定元素 tableau下载 ps蒙版抠图详细教程 js给标签添加属性 海蜘蛛软路由 winfax 截取字符串 马颂德
当前位置: 首页 > 学习教程  > 编程语言

复习:玩转nginx常用模块(含详细说明)

2021/2/13 20:22:30 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录引言思路环境配置前准备配置详解总结参考引言 最近在准备春招中,这几天把学过的nginx常用模块复习了一遍,并作整理记录,便于以后回看。 思路 先在nginx中配置下列功能: 搭建静态资源服务器具有缓存功能的反向代理服务…

文章目录

    • 引言
    • 思路
    • 环境
    • 配置前准备
    • 配置详解
    • 总结
    • 参考

引言

最近在准备春招中,这几天把学过的nginx常用模块复习了一遍,并作整理记录,便于以后回看。

思路

先在nginx中配置下列功能:

  • 搭建静态资源服务器
  • 具有缓存功能的反向代理服务器
  • 使用goaccess分析access日志
  • 用自签证书搭建https站点

再依次添加其他模块:limit_conn、limit_req、access、auth_basic、auth_request、log、gzip、stub_status等实现更丰富的功能

环境

在Ubuntu20.10(当前最新版)上,apt安装了一个nginx,版本为1.18.0。为方便连接,在Ubuntu20.10上设置固定ip。

HostIPNginx version
Ubuntu20.10192.168.211.1311.18.0

配置前准备

  1. 安装goaccess,后台执行goaccess命令
sudo apt install goaccess -y
sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --time-format='%H%M%S' --date-format='%d%m%Y' --log-format=COMBINED &
# 生成websocket服务器监听客户连接
  1. 生成自签SSL证书
  • 创建证书请求csr,同时生成rsa私钥
sudo openssl req -new -out ssl.csr
  • 上一步生成 .pem 私钥时必须输密码,可执行去除密码命令
sudo openssl rsa -in privkey.pem -out privkey.pem
  • 由私钥、证书请求生成证书
sudo openssl x509 -req -days 365 -signkey privkey.pem -in ssl.csr -out ssl.crt
  • 查看rsa密钥、csr证书请求、crt证书
sudo openssl rsa -text -in privkey.pem -noout
sudo openssl req -text -in ssl.csr -noout
sudo openssl x509 -text -in ssl.crt -noout

配置详解

主配置文件nginx.conf,加载 conf.d/ 目录下的 .conf 配置文件

#user www-data;
user root;      # 修改nginx执行用户为root
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##  
        # Basic Settings
        ##  

        sendfile on; 
        tcp_nopush on; 
        types_hash_max_size 2048;
        # server_tokens off;
        
        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        include /etc/nginx/conf.d/*.conf;       # 加载自定义配置
        # include /etc/nginx/sites-enabled/*;
}


静态资源服务器配置文件 static_web.conf,这里添加了limit_conn、limit_req、autoindex、rewrite等模块

# 80端口的虚拟主机
# 限制连接
limit_conn_zone $binary_remote_addr zone=connip:10m;    # 限制每个客户端ip的并发连接数
limit_conn_zone $server_name zone=connserver:10m;       # 对虚拟主机的连接限制(不生效,难道是对域名才生效?)
limit_req_zone $binary_remote_addr zone=reqip:10m rate=2r/m; # 限制每个ip的请求速率


server {
        listen 80 default_server;
        listen [::]:80 default_server;
		
		root /var/www/html;

        index index.html index.htm index.nginx-debian.html;
        rewrite ^/(.*)$ https://192.168.211.131:443/$1 permanent;
        # http的访问重写为https
        server_name _;
        # 配置静态资源服务器
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                limit_conn connip 3;    # 每个ip并发连接数最多为3
                limit_conn_status 503;  # 超过就返回503
        }

        location /blog {
                autoindex on;   # 文件共享
        }

        location ~ \.jpg$ {     # 区分大小写的正则匹配,匹配.jpg的uri; 不能写成*\.jpg??
                index TS.jpg;   # index显示文件
        }

        location ~* \.mp4$ {    # 不分大小写的正则匹配
                index BlankSpace.mp4;
        }
}

具有缓存功能的反向代理服务器 proxy_cache.conf,同时添加 goaccess 分析访问日志功能。

# 具有缓存功能的反向代理服务器
upstream webserver {
        server 192.168.211.131 max_fails=3 fail_timeout=30s;
        # max_fails 允许失败次数,默认为1
        # fail_timeout 当max_fails次失败后,暂停把请求交给该后端服务器的时间
}

# 这个buffer还没搞懂,看看能不能解决206的问题
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;

# 指定缓存路径,缓存区域名称,内存缓存空间大小10m,磁盘缓存空间10g,60分钟没被访问自动清除,这里不额外指定temp路径
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

#map $request_method $purge_method {
#       PURGE   1;
#       default 0;
#}

server {
        listen 100;

        location / {
                # 传递真实地址(客户端IP)(没法传递?)
                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://webserver;
                # 把100端口请求交给80端口
                # 缓存功能
                proxy_cache my_cache;
                proxy_cache_key $host$uri$is_args$args;
                proxy_cache_valid 200 304 1d;
                proxy_cache_valid 301 302 5m;
                proxy_cache_valid any 1m;
                expires 1d;     # 浏览器缓存1天
                #proxy_cache_purge $purge_method;
        }

        location ~ /purge(/.*) {
                # 只允许指定ip段才可清除uri缓存
                 allow 127.0.0.1;
                 allow 192.168.211.0/24;
                 deny all;
                 proxy_cache_purge my_cache $host$uri$is_args$args;
        }

        # 以.php、.cgi、.jsp结尾的动态资源不缓存
        location ~ \.(php|cgi|jsp)$ {
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_pass http://webserver;
        }

        # goaccess分析access日志
        location /report.html {
                alias /var/www/html/report.html;
        }
}

https站点配置 https.conf

# 自签证书搭建https站点
server {
        listen 443 ssl;
        root /var/www/html;
        index index.nginx-debian.html;

        ssl_certificate /etc/nginx/key/ssl.crt;
        ssl_certificate_key /etc/nginx/key/privkey.pem;

        limit_conn connip 5;    # 该https站点最大并发连接数为5
        limit_conn_status 500;  # 超过就返回500
        limit_conn_log_level warn;      # 限制发生时的日志级别
        limit_rate 50;         # 限制响应速率,方便测试 limit_conn模块
        # 单位为每秒字节数

        limit_req zone=reqip;  # 限制每个ip请求速率
        # limit_req_status可以不定义,默认503
        # 经测试,limit_req 优先级高于 limit_conn

        location / {
                try_files $uri $uri/ =404;
        }

        location /blog {
                autoindex on;   # 自动索引,列出文件列表
                # access模块作访问控制,auth_basic模块作认证处理
                satisfy all;    # 值为all,满足所有access阶段的模块才通过;
                # 值为any,满足任意一个access阶段模块就行
                allow 192.168.211.0/24;
                deny all;

                auth_basic "closed site"; # 认证字符串
                auth_basic_user_file /etc/nginx/conf.d/passwd;  # 认证用户文件
                # 如果认证失败,accesslog中响应状态码是401(Unauthorized)
        }
        # auth_request模块根据子请求响应状态码作认证
        location /willow.webm {
                auth_request /auth;
        }

        location = /auth {
                proxy_pass https://192.168.211.131:443/auth_test;
        }

        location /auth_test {
                return 503;
                # 子请求返回200状态码,允许访问;返回401或403,拒绝访问并返回状态码
                # 如果是其他状态码,视作错误,返回500错误状态码
        }

        location /status {              # 使用 stub_status模块
                stub_status on;         # 查看nginx基本状态信息
                access_log off;
                allow 192.168.211.0/24; # 作访问控制
                deny all;
        }
}

gzip模块

# gzip模块的配置

gzip on;
gzip_buffers 16 8k;     # 压缩响应的缓冲区数量大小
gzip_min_length 100;    # 小于100字节的不压缩
gzip_comp_level 3;      # 压缩级别3
gzip_types text/plain; # 压缩类型(mime-type)
gzip_http_version 1.1;  # 压缩响应的请求http版本
gzip_vary on;           # 压缩响应的头部添加Vary字段

log模块

# access_log和error_log的配置

# 把默认的combined格式改为compression(多了$gzip_ratio字段)
log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';
# 指定访问日志路径、格式、缓存大小、压缩级别;达到flush的过期时间,就把日志从内存写到磁盘
access_log /etc/nginx/logs/access.log compression; # buffer=32k gzip flush=20s;
# 注意:这里如果使用了buffer或gzip参数,写入日志的内容会被缓存;这时access.log就暂时看不到新的访问记录

# open_log_file_cache max=100 inactive=20s valid=1m min_uses=1;
# 对名字包含变量名的日志文件做优化

error_log /etc/nginx/logs/error.log;	# error.log路径

总结

nginx提供的模块相当多,可以实现不少好玩的功能。需要配置某个模块时,可查看官方文档 http://nginx.org/en/docs/ 。官网的文档给出了每个模块的配置例子,指令的语法、默认值和上下文,以及每个参数的功能和用法等,相当全面。

梳理出整个配置过程中用到的所有模块:

模块名称功能
http_core_module核心功能模块
http_proxy_module反向代理模块
http_upstream_module负载均衡模块
http_ssl_modulessl模块,配置https站点
http_rewrite_moduleurl重写模块,可以把http访问重定向到https
http_gzip_module压缩模块,压缩nginx的响应
http_access_module访问控制模块
http_auth_basic_module基本认证模块,访问时要输入用户名和密码
http_auth_request_module请求认证模块,对特定uri的请求作访问控制
http_autoindex_module自动索引模块,返回目录下的文件列表
http_limit_conn_module连接限制模块,限制客户端并发连接数
http_limit_req_module请求限制模块,限制客户端请求速率
http_log_module日志模块,配置 access_log
http_stub_status_module状态检测模块,查看nginx基本状态信息

正月初二,写下了2021年的第一篇博客。新年快乐!

参考

Nginx官方文档
Nginx部署web缓存服务环境 - 操作记录
Nginx的proxy_cache缓存效能
SSL Certificate Verification
使用nginx访问服务器log日志
Debian Apt-get方式添加Nginx模块


本文链接: http://www.dtmao.cc/news_show_700455.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?