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

news/2024/7/10 1:06:35 标签: nginx, 运维, linux, ubuntu, 负载均衡

文章目录

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

引言

最近在准备春招中,这几天把学过的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.niftyadmin.cn/n/1455238.html

相关文章

Java6 WebService学习

参考了网络上中资料,自己学习实践了一个Java6 WebService. 首先,建立一个WebService: package garfield;import javax.jws.WebService;import javax.xml.ws.Endpoint;WebServicepublic class MyJ6WebService {public String SayHello(String strName) {r…

复习:Shell脚本练习

1. nginx日志切割脚本 nginx_log_rotate.sh #!/bin/bash # nginx日志切割脚本dateFormatdate %Y%m%d # 时间格式 baseDir"/usr/local/nginx" # nginx目录 nginxLogDir"$baseDir/logs" # nginx日志目录 logName"access" …

Java设计模式之一:观察者模式

目录 一、什么是观察者模式 二、如何使用观察者模式 三、观察者模式的优势和使用场景 一、什么是观察者模式 观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系。在该模式中,一个主题(被观察者)维护了一个观…

uva 11151 Longest Palindrome(LCS)

题目连接:11151 - Longest Palindrome 题目大意:给出一个字符串,计算这个字符串的最长回文子串, 不同的是,它的子串可以不连续。 解题思路:刚开始把这道题当成普通的回文串来做了, 用了manachar…

使用Profile和Membership时的一些操作

进入用户后台FormsAuthentication.SetAuthCookie(strUserName, false);Response.Redirect("../member/index.aspx", true);获取用户的Profile和Membership信息MembershipUser mu Membership.GetUser(strUserName);ProfileCommon p Profile.GetProfile(strUserName);修…

Windows Server 2008 RemoteApp(一)---部署远程桌面服务器

RemoteApp中的RD会话主机又称远程桌面服务器,前身是终端服务器,比起终端服务器来说,远程桌面服务器的功能更为强大,在终端服务器时代,我们在服务器端编辑的Office文档要传送回本地客户端,往往会很困难&…

6个实用的python脚本

文章目录前置知识1.监控CPU idle2.监控空闲内存3.监控磁盘用量4.第三方库自动安装脚本5.统计nginx日志访问量前十ip,并用柱状图显示6.爬取网页图片到本地参考前置知识 os.popen()方法能够打开管道,获取一条命令的输出信息 1~3都是三个监控脚本&#xf…

【摘自MSDN】C# 泛型简介

C# 泛型简介发布日期 : 5/30/2005| 更新日期 : 5/30/2005Juval Lowy IDesign 摘要:本文讨论泛型处理的问题空间、它们的实现方式、该编程模型的好处,以及独特的创新(例如,约束、一般方法和委托以及一般继承)。此外&…