4.Nginx配置文件
  IS4yhiOomKTv 2023年11月02日 27 0

Nginx 核心模块

模块配置文件位置/apps/nginx/conf/
模块配置文件:/apps/nginx/conf/nginx.conf
nginx配置文件配置格式
全局配置:不带{}的
如:#user  nobody;
worker_processes  1;

带{}的为对某一模块设置
如:事件驱动模块 
events{                   
worker_processes 1;
}
http/https 协议相关配置段 
http {  
... 
}    
mail 协议相关配置段 
mail {  
... 
}     
#stream 服务器相关配置段 
stream {  
... 
}
nginx配置文件全局配置

Main 全局配置段常见的配置指令分类

正常运行必备的配置 
优化性能相关的配置 
用于调试及定位问题相关的配置
事件驱动相关的配置

全局配置说明:

1、user nginx nginx;  启动nginx工作进程的用户和组;(切换用户要注意属性问题,用户要和下面文件的属性一致)
master进程必须是root,因为他要监听80端口,接收用户的请求,把请求下发到woeker来处理。只有root有权限监听1023以下的端口号。  
nc命令可以监听端口,如:nc -l 666端口,只有root可以监听,其他用户无权限监听
2、worker_processes number|auto; 启动Nginx工作进程的数量,一般设为和CPU核心数相同(auto)
更改配置文件后,重新加载 nginx -s reload
3、将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU, 但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能.
cpu核心与进程绑定叫做cpu的亲缘性
如何绑定亲缘性:worker_cpu_affinity 000000001|auto 第一颗cpu绑第一个worker进程,以此类推。auto自动
如:worker_cpu_affinity 01 10;查看cpu和哪个进程绑一起  ps axo pid,cmd,psr |grep nginx
4、错误日志 配置文件的错误日志 路径:/apps/nginx/logs/error.log; 可以加等级,可以指定路径,程序启动错误,可根据错误日志来排错
5、pid文件,master进程编号 系统自动分配的,停系统后,pid文件就没有了 路径:/apps/nginx/logs/pid
6、worker_priority 0; 工作进程优先级, -20~19 (值越小,优先级越高)
配置文件中更改优先级:worker_priority -10;  重新加载 nginx -s reload,
查看优先级,ps axo pid,cmd,ni |grep nginx
7、worker_rlimit_nofile 65536;所有worker进程能打开的文件数量上限,包括nginx得所有连接,连接一个,在worker进程下生成一个socket文件。
socket文件所在位置:先查看工作进程端口号ps aux |grep nginx,
根据端口号查看所在位置:ll /proc/端口号/fd
数量上限最好与ulimit -n或者limits.conf得值保持一致。
修改ulimit -n的值文件:vim /etc/security/limits.conf
nofile - max number of open file descriptors或者直接修改:ulimit -n 100000(此值默认为1024)
8、daemon off;守护进程 默认是on 前台运行Nginx服务用于测试,或者以容器运行时,需要设为off,如果后台运行,会直接退出。
9、master_process off|on;是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on。如果关闭这一项,就只剩下master进程。不需要更改
10、
events {  
worker_connections  65536;        #设置单个工作进程的最大并发连接数,要和总的相互匹配 
use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select,poll,epoll,只 能设置在events模块中设置.   (性能优化选择epoll)
accept_mutex on; #on为同一时刻一个请求轮流由worker进程处理,而防止被同时唤醒所有 worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊 群",因此nginx刚安装完以后要进行适当的优化.建议设置为on  (节约资源)
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个.建议设置为on }
配置文件的全局配置从哪些方面可以优化nginx性能
1、工作进程的数量,设为和CPU核数相同
2、结亲缘,cpu核与工作进程进行绑定,防止工作进程在cpu上来回跳转
3、设置工作进程优先级 orker_priority -20
4、置工作进程的最大并发连接数 如:worker_connections  65536
5、epoll 支持众多的事件驱动
6、启accept_mutex on; 防止惊群,一个请求来了只需要一个worker为其服务。 默认为off
7、multi_accept on;工作进程可以接受多个网络连接。  默认为off
范例: 实现 nginx 的高并发配置
[root@ubunt html]# ulimit -n 102400 调大连接数
在另一机器安装对nginx的压力测试工具
[root@10 ~]# yum -y install httpd-tools (红帽下安装包)
[root@10 ~]# while true;do ab -c 5000 -n 10000 http://10.0.0.200/;sleep 0.5;done
从另一台机器死循环方式发起5000个并发,10000次的压力测试机器

默认配置不支持高并发,会发现以下错误日志
[root@ubunt html]# tail -f /apps/nginx/logs/error.log
0: *1105860 open() "/apps/nginx/html/50x.html" failed (24: Too many open files), client: 10.0.0.7, server: localhost, request: "GET / HTTP/1.0", host: "10.0.0.8"

Ubuntu默认值比较高,无需调整:
cat /proc/25149/limits
Limit                         Soft Limit           Hard Limit            Units
Max open files                 1024                 524288               files
Rocky8默认值比较低,需要调整:
Limit                         Soft Limit           Hard Limit            Units
Max open files                 1024                 262144               files

如果systemd启动,则需要修改nginx.service文件中加LimitNOFILE=100000,才能有效
vim /lib/systemd/system/nginx.service
[Service]
...... 
LimitNOFILE=100000
.....
添加之后:systemctl daemon-reload   systemctl restart nginx
如果非systemd启动,可以修改下面pam限制:
vim /etc/security/limits.conf
*               soft   nofile          1000000 
*               hard   nofile          1000000

vim /apps/nginx/conf/nginx.conf
worker_rlimit_nofile 100000;
systemctl restart nginx
watch -n1 'ps -axo pid,cmd,nice | grep nginx 验证优先级
http配置块 (core module核心模块)

http 协议相关的配置结构

http { 
...
...                                  各server的公共配置
server {                             每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
} 
server {     
... 
server_name                          虚拟主机名
root                                 主目录
alias                                路径别名
location [OPERATOR] URL {            指定URL的特性
if CONDITION { 
...
} 
} 
} 
}
http协议配置说明
MIME
在响应报文中将指定的文件扩展名映射至MIME对应的类型
include           /etc/nginx/mime.types;
default_type     application/octet-stream;除mime.types中的类型外,指定其它文件的默认 MIME类型,浏览器一般会提示下载
types {   
text/html html;   
image/gif gif;   
image/jpeg jpg;

如:识别php文件为text/html
vim /apps/nginx/conf/nginx.conf
http {
include       mime.types;   
default_type application/octet-stream;  
types{      
text/plain php;                       加此行
nginx -s reload                       重新加载

curl -I http://10.0.0.100/test.php
HTTP/1.1 200 OK 
Server: nginx/1.18.0 
Date: Thu, 24 Sep 2020 13:56:26 GMT 
Content-Type: text/html 
Content-Length: 612 
Last-Modified: Thu, 24 Sep 2020 12:13:03 GMT 
Connection: keep-alive
ETag: "5f6c8d4f-264" 
Accept-Ranges: bytes
指定响应报文server首部
是否在响应报文中显示nginx版本
server_tokens on | off | build | string;
如:http {
    server_tokens on   放在server,http,location语句块都可以
nginx -s reload        重新加载      

修改server字段
如果想自定义响应报文的nginx版本信息,需要修改源码文件,重新编译 
如果server_tokens on,修改 src/core/nginx.h 修改第13-14行,如下示例
如:vim /usr/local/src/nginx-1.22.0/src/core/nginx.h
define NGINX_VERSION     "1.68.9" 
define NGINX_VER         "nginx/" NGINX_VERSION
http常见核心模块配置
基于不同的IP,不同的端口以及不同的域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现
新建一个 PC web 站点、一个mobile web站点(写一个独立的配置文件,用主配置文件里的include包含)
创建pc网站配置
第一步:创建网站存放数据的文件夹
mkdir -p /data/nginx/html/{pc,mobile} pc端一个,移动端一个

第二步:cd /data/nginx/html/pc/
把拷贝的京东商城pc端页面两个文件夹拉进来
ls
index_files  index.html
把拷贝的京东商城移动端页面两个文件夹拉进来
ls
index_files  index.html

第三步:理论上把pc网站需要的配置放到主配置文件下的http语句就可以,但是为了后期管理方便,建议自己写的东西专门写一个独立的配置文件,用主配置文件里的include包含。
实际操作:
定义子配置文件路径
mkdir /apps/nginx/conf/conf.d
vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/conf.d/*.conf;在配置文件的最后面添加此行,注意不要放在最前面,会导致前面的命令无法生效

第四步:cd /apps/nginx/conf/conf.d
创建网站配置文件
touch www.meng.org.conf   pc端
touch m.meng.org.conf     移动端
[root@ubunt conf.d]# ls
m.meng.org.conf  www.meng.org.conf

第五步:对www.meng.orrg.conf 写入配置
[root@ubunt conf.d]# vim www.meng.org.conf
server {
    listen 80;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
}
对m.meng.org.conf 写入配置
server {
    listen 80;
    server_name m.meng.org;
    root /data/nginx/html/mobile/;
}
    
第五步:DNS解析

第六步:nginx -s reload

第七步:通过域名在网页上进行访问,测试是否完成www.meng.org   m.meng.org
如果直接访问ip,访问的结果是nginx自带的默认index.html文件
为什么出现这种情况?
因为我们把include /apps/nginx/conf/conf.d/*.conf;写在了配置文件/apps/nginx/conf/nginx.conf
的最下面,如果放在系统默认的server前面,再通过IP去访问,就会访问到排在第一个的移动端网站

如果在网站配置为文件中写入default_server;表示默认主机,否则排在前边的为默认主机
无论是通过ip还是域名都可以访问到这个网站
如:www.meng.org.conf
server {
    listen 80 default_server;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
}
nginx -s reload
不论是ip还是www.meng.org 都可以访问到网站
grep -Ev "#|^$" /apps/nginx/conf/nginx.conf
把include /apps/nginx/conf/conf.d/*.conf;放在最后
现在在访问,会直接访问到默认网站
如:curl 10.0.0.100  会访问到nginx系统自带的index.html文件中
如果要求他访问到你指定的网站,需要加主机头
如:curl -v -H "host:www.meng.org" 10.0.0.100 |less
在一个物理服务器上建多个网站的方法有三种来区分(一般用主机头来区分)
第一:根据端口号区分
如:一个网站用80,一个用81,一个用82.但端口号区分,用户访问时得输地址加端口号
第二:ip来区分,不同的ip对应不同的网站
如:server{
listen    10.0.0.101:80;
}
第三:在server上加主机头
如:server{
server_name host: www.meng.org
}
root与alias
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
} 
其中root指得是存放网站页面的目录根路径,如果在网站上访问www.meng.org/test/index.html,得去/data/nginx/html/pc/下去找,如果不想test放在这里去找,而是放在/opt/pc/test/index.html下去找,怎么样才可以实现?

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/; 
    location /test/ {     使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
     alias /opt/pc/;      要加都加,要不加都不加
    }
} 
nginx -s reload
意思是当你访问test这个文件夹时,去/opt/pc/test/找,而不是/data/nginx/html/pc/,只是针对test这个文件夹单独设置了一个特殊设置,其他的还是往/data/nginx/html/pc/找。
另外还需要为test创建一个文件夹
mkdir -p /opt/pc
touch /opt/pc/index.html
echo /opt/pc/index.html > /opt/pc/index.html
去网页访问test文件下的index.html
http://www.meng.org/test/index.html
结果就是/opt/pc/index.html
location的详细使用

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请 求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置

在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是 用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果 匹配成功就结束搜索,并使用此location处理此请求.

location 官方帮助:

http://nginx.org/en/docs/http/ngx_http_core_module.html#location
语法规则:location [ = | ~ | ~ * | ^ ~] uri {...} 允许放在server语句块和location语句块

=       #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 
^~      #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左边部分做匹配检查,不区分字符大小写
~       #用于标准uri前,表示包含正则表达式,并且区分大小写 
~*      #用于标准uri前,表示包含正则表达式,并且不区分大小写 
不带符号  #匹配起始于此uri的所有的uri \   #用于标准uri前,表示包含正则表达式并且转义字符.可以将 . * ?等转义为普通符号 
#匹配优先级从高到低: =, ^~, ~/,~*, 不带符号

官方示例

location = / {               如果访问http://www.meng.org/是可以的
    [ configuration A ]     这样http://www.meng.org/index.html 多了后面的就是不可以的
}                            后面必须是根

location / {                 如果访问http://www.meng.org/只要/开头都算
    [ configuration B ]      
} 

location /documents/ {   
    [ configuration C ] 
} 

location ^~ /images/ {      
    [ configuration D ]
} 
    
location ~* \.(gif|jpg|jpeg)$ {   如:http://www.meng.org/xxx/a.jpg
    [ configuration E ]           
} 
    
The “/” request will match configuration A(?), the “/index.html” request will match configuration B,
the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E
如果访问http://www.meng.org/ 以上A和B是满足的 A的优先级高
如果访问http://www.meng.org/index.html 只有B是满足的
如果访问http://www.meng.org/decuments/decuments.htmlB和C都满足,优先级一样,但C匹配度更精确,C生效 
如果访问http://www.meng.org/images/1.gif BDE匹配 D优先级高,D生效
如果访问http://www.meng.org/decuments/1.jpg BCE满足,不带符号优先级最差,E高E生效

范例
在/apps/nginx/conf/conf.d下新建测试文件
vim test.conf
server {
   listen 80;
   server_name location.meng.org;
   location = / {
       default_type text/html;
       return 200 'location = /';
}
   location / {
       default_type text/html;
       return 200 'location /';
}
   location /documents/ {
       default_type text/html;
       return 200 'location /documents/';
}
   location ^~ /images/ {
       default_type text/html;
       return 200 'location ^~ /images/';
}
   location ~* \.(gif|jpg|jpeg)$ {
       default_type text/html;
       return 200 'location ~* \.(gif|jpg|jpeg)';
   }
}
nginx -s reload
DNS解析:location.meng.org   改/etc/hosts文件

测试结果如下,建议是curl测试
#1.请求http://location.meng.org/ 会被 location =/ 匹配
#2.请求http://location.meng.org/index.html 会被location / 匹配
#3.请求http://location.meng.org/documents/1.html 会被location /documents/ 匹配
#4.请求http://location.meng.org/images/1.gif 会被 location ^~ /images/ 匹配
#5.请求http://location.meng.org/documents/1.jpg 会被 location ~* \.(gif|jpg|jpeg)$匹配

利用优先级有什么作用?

可以根据不同的url做匹配,做分支判断。
例如带有资源的,用独立的代码来处理,而不用系统默认的根目录来处理,可以实现动静分离
静态资源如:html、css、js、jpg服务端什么样,客户端拿过来什么样,不变的
动态资源是程序:如php、jsp、scp 要在服务端运行,把运行结果封装成响应报文发给客户端
location @重定向

location @name 这样的location不用于常规请求处理,而是用于请求重定向

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    error_page 404 @error_404;
    location @error_404 {
       default_type text/html;
       charset utf8;
       return 200 '你访问的页面可能走丢了!';
    }
}
访问一个不存在的页面,报状态码404,如果出现404状态码,则由@error_404;来处理,如何处理,就是返回你访问的页面可能走丢了
自定义错误处理,实现了这种情况下的特殊处理

Nginx 常见模块

Nginx 四层访问控制

访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制

注意: 如果能在防火墙设备控制,最好就不要在nginx上配置,可以更好的节约资源

官方帮助:

http://nginx.org/en/docs/http/ngx_http_access_module.html

语法格式:

Syntax:	allow address | CIDR | unix: | all;
Default:	—
Context:	http, server, location, limit_except

范例

allow 允许
deny  拒绝
格式如:
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    deny 10.0.0.1;                 拒绝10.0.0.1访问
    allow 10.0.0.0/24;             允许10.0.0.0/24访问
    deny all;                      拒绝所有
}
按先小范围在前,大范围在后排序

用10.0.0.1对其进行访问     curl www.meng.org  报状态码403,拒绝访问
用其他同网段ip进行访问,可以访问的通
Nginx 账户认证功能

由 ngx_http_auth_basic_module 模块提供此功能

官方帮助:

http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
范例
auth basic             提示字符串       
auth basic user file   后跟密码账户的文件路径

第一步:安装
需要安装包来启动这个服务
centos安装包
yum -y install httpd-tools
ubuntu安装包
apt -y install apache2-utils


第二步:创建访问认证用户和密码
创建用户 -c 
非交互式方式提交密码 -b
htpasswd -cb /apps/nginx/conf/.htpasswd user1 123456   #创建用户、密码和存放文件
cat /apps/nginx/conf/.htpasswd                         #查看存放用户密码的文件
user1:$apr1$2luIRVEi$RhPG6IuR5Jvn9kghpnGPH/
再创建第二个账户,不需要加c,加c就把第一个覆盖了
htpasswd -b /apps/nginx/conf/.htpasswd user2 123456


第三步:创建资源
cd /data/nginx/html/pc/
mkdir admin
echo admin page > admin/index.html

第四步:配置资源可认证访问
vim www.meng.org.conf
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;    
    location /admin {                                 # 访问admin这个文件是需要密码的         
        auth_basic      "please input username and password";   # 提示字符串
        auth_basic_user_file /apps/nginx/conf/.htpasswd;        # 账户密码文件
   }
}
nginx -s reload
tail -f /apps/nginx/logs/access.log   打开访问日志

在另一机器进行访问curl www.meng.org/admin/ 报状态码401(质询) 弹出对话框,输入用户密码
新版本的浏览器不显示提示字符串   IE浏览器可以 在windos命令行 输iexplore调出IE浏览器 
也可非交互式访问 curl http://user1:123456@www.meng.org/admin/
admin page

以上走的是http协议,账户密码可以被抓包软件抓到。 不加密的协议,都可以被抓到包。
自定义错误页面

自定义错误页,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location

当指定的error出现之后,可以跳转到指定的URI(访问的链接地址,可以是本机的某一个路径)

例如:出现404,可以返回错误页面,也可重定向为200。

官方帮助:

http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
范例
vim /apps/nginx/conf/conf.d/www.meng.org.conf
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    error_page 404   /error_page/404.html;
}
创建error_page文件夹
cd /data/nginx/html/pc
mkdir error_page
cd mkdir error_page
把实验用的文件拉进来
404.html
nginx -s reload
在网访问www.meng.org/xxx.html  
出现错误,可以把错误页面做好看一点。 
也可以出现错误后跳转到网站首页
error_page 404 =200  /index.html;
nginx -s reload
就会跳转到正常页面
可用命令测试下,在另一主机,对于名进行解析后访问
curl https://www.meng.org/xxx.html -I
响应码200一定成功吗?
不一定是真正正确的,有可能是错误页面跳转过来的
自定义错误日志
Syntax: error_log file [level]; 
Default: error_log logs/error.log error; 
Context: main, http, mail, stream, server, location 
level: debug, info, notice, warn, error, crit, alert, emerg

范例:
创建某个网站的错误日志存放文件夹
touch /apps/nginx/logs/www.meng.org-error.log
vim /apps/nginx/conf/conf.d/www.meng.org.conf
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    error_log  /apps/nginx/logs/www.meng.org-error.log; 启用错误日志路径
}
nginx -s reload
在另一主机进行错误访问然后查看日志
tail /apps/nginx/logs/www.meng.org-error.log -f
2022/09/17 15:19:27 [error] 25040#0: *195 open() "/data/nginx/html/pc/xxx" failed (2: No such file or directory), client: 10.0.0.1, server: www.meng.org, request: "GET /xxx HTTP/1.1", host: "www.meng.org"
关闭错误日志
error_log /dev/null;
检测文件是否存在

try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹), 如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数.只有最后一个参数可以引起 一个内部重定向,之前的参数只设置内部URI的指向.最后一个参数是回退URI且必须存在,否则会出现 内部500错误.

语法格式

Syntax: try_files file ... uri;
try_files file ... =code; 
Default: — 
Context: server, location
范例:如果访问不存在页面,返回自定义的状态响应码
server {
    listen 80 ;
    server_name http://www.meng.org;
    root /data/nginx/html/pc/;
    try_files $uri $uri/index.html $uri.html =489;
}
访问 www.meng.org/xxx
都没有文件,最后转到489

创建xxx.html文件
echo xxx.html > xxx.html
重新访问 www.meng.org/xxx 页面会执行到xxx.html,出现xxx.html
长连接配置(时间调长,并不会连接上就不断了)

官方帮助:

http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
格式一:
Syntax: keepalive_requests number;
Default: 
keepalive_requests 1000;     (默认1000次)
Context: http, server, location

格式二:
Syntax: keepalive_time time; 
Default:
keepalive_time 1h;           (默认1h)
Context: http, server, location

格式三:
Syntax: keepalive_timeout timeout [header_timeout];
Default:
keepalive_timeout 75s;       (默认75s)
Context: http, server, location

一:keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为1000次
二:keepalive_time time; #限制对一个连接中请求处理的最长时间,到时间后续的再有新的请求会断开连接, 默认1h
三:keepalive_timeout timeout [header_timeout];  #设置保持空闲的连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置

范例:
测试网站是否为长连接 telnet 10.0.0.200 80
Trying 10.0.0.200...
Connected to 10.0.0.200.
Escape character is '^]'.  
连接之后,模拟浏览器发GET请求
GET / HTTP/1.1    
HOST: www.meng.org
回车
连接上之后不操作默认75s断开连接,如果是HTTP1.0,下载完就断开了
时间可以根据自己的需要来调试
作为下载服务器配置

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用

官方文档:

http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
格式:
Syntax: autoindex on | off;     文件自动索引功能,默认为off
Default: 
autoindex off;         
Context: http, server, location

autoindex_exact_size on | off; 计算文件确切大小(单位butes),off显示大概大小(单位K、M),默认ON
autoindex_localtime on | off; 显示本机时间,默认off
charset charset | off; 指定字符编码,默认off,中文会乱码,指定为utf8
autoindex_format html | xml | json | jsonp;显示索引文件的页面文件风格,默认html
The limit_rate rate;#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即 bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
范例:实现下载站点
创建文件夹用于存放安装包
mkdir /data/nginx/html/mirrors/ubuntu -p
新建网站域名及配置网站server
vim /apps/nginx/conf/conf.d/mirrors.meng.org.conf
server{
    listen 80;
    server_name mirrors.meng.org;
    autoindex on;                     文件自动索引功能开启
    autoindex_exact_size off;          关闭精确大小,容易看文件大小
    limit_rate 100k;                  限速 在另一机器curl -O 可看下载速度 -k忽略证书
    root /data/nginx/html/mirrors/;
}
nginx -t 检查语法
nginx -s reload 重新加载

rsync -avz rsync://mirrors.tuna.tsinghua.edu.cn/ubuntu /data/nginx/html/mirrors/ubuntu
或者把光盘挂载上去当源
mount /dev/sr0 /data/nginx/html/mirrors/ubuntu 里面就有内容了

DNS解析:对mirrors.meng.org域名进行解析
通过域名进行访问:mirrors.meng.org/ubuntu 就可以看到安装包
下载的话就访问到安装包,复制路径,wget或者 curl -O就可以下载了。
限速限流
为什么要限速
限制某个用户在一定时间内能够产生的Http请求或者限制某个用户的下载速度.防止个别用户对资源消耗过多,导致其它用户受影响. 启用限速后,如果超过指定的阈值,则提示503过载保护
限速相关模块
下载限速:限制用户下载资源的速度
ngx_http_core_module

请求限制:限制用户单位时间内所产生的Http请求数
ngx_http_limit_req_module

连接限制:限制同一时间的连接数,即并发数限制
ngx_http_limit_conn_module
请求频率限速原理
先将请求放置缓存中,然后按指定速度持续处理.当请求速度超过了处理速度会导致缓存被占满,如果还有没有放入缓存的请求,则会被丢弃.工作原理类似漏斗
限制下载速度范例(前100MB不限速,超过100MB之后限速100K)
vim /apps/nginx/conf/conf.d/mirrors.meng.conf
server{
    listen 80;
    server_name mirrors.meng.org;
    autoindex on;                     文件自动索引功能开启
    autoindex_exact_size off          关闭精确大小,容易看文件大小
    limit_rate 100k;                  限速100k    在另一机器curl -O 可看下载速度 -k忽略证书
    limit_rate_after 100m;            下载达到100MB数据后开始限速
    charset utf8;                     默认字符集
    root /data/nginx/html/mirrors/;
}
限制请求数(限制同一个IP的同时发起的最大请求数)
官方文档:ttp://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Syntax: limit_req_zone key zone=name:size rate=rate [sync];
Default: — 
Context: http 

Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: — 
Context: http, server, location 

Syntax: limit_req_status code; 
Default: 
limit_req_status 503;
Context: http, server, location

示例:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;  #每秒10个请求
... 
server {
... 
location /search/ {
limit_req zone=one burst=5; 
limit_req_status 500; # 默认503,可以指定其他状态码
}
参数说明:
limit_req_zone定义在http块中,$binary_remote_addr表示以客户端IP地址的二进制形式为限流依据的key
Zone定义IP状态及URL访问频率的共享内存区域.zone=keyword标识区域的名字,以及冒号后面跟区域大小.8000个IP地址的状态信息约1MB,例子区域可以存储80000个IP地址.
Rate定义最大请求速率.示例中速率不能超过每秒10个请求.超过此速率的请求放入burst队列做延迟处理 
burst表示队列大小,当此队列满后,会中断请求报错 
nodelay表示超过请求速率并且缓存区满后不延迟处理,立即返回503错误 

#可以有几个limit_req指令.例如,以下配置将限制来自单个IP地址的请求的处理速率,同时限制虚拟服务器的请求处理速率

范例:基于来源IP对下载速率限制,限制每秒处理1次请求,缓存区请求突发队列为10个

http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
注意 : $remote_addr和$binary_remote_addr的不同
vim /apps/nginx/conf/conf.d/www.meng.org.conf
limit_req_zone $binary_remote_addr  zone=req_one:10m rate=1r/s;
#限制ip,同一个用户限制1s1个请求
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    limit_req zone=req_one burst=10 nodelay; 允许10个队列请求,再多就拒绝了。
}
nginx -s reload
查看日志: tail -f /apps/nginx/logs/error.log
访问www.meng.org 超过10个后报状态码503 限制请求连接,超过之后就丢弃了。
限制并发连接数(限制同一个IP同时发起的最大并发连接数)
格式:
Syntax: limit_conn_zone key zone=name:size; 
Default: — 
Context: http 

Syntax: limit_conn zone number; 
Default: — 
Context: http, server, location

范例:设置共享内存区域和给定键值的最大允许个连接数.超过此限制时服务器将返回503错误
vim /apps/nginx/conf/conf.d/www.meng.org.conf
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    limit_conn conn_zone 2;     限制两个并发
}
nginx -s reload
测试:ab -c 2 -n 10 http://www.meng.org/ 并发两个总共10个
查看日志:tail /apps/nginxlogs/error.log 正常
测试:ab -c 3 -n 10 http://www.meng.org/ 并发两个总共10个
查看日志:出现错误 报状态码503,限制连接请求,超过并发量
综合实战

实现百度云盘非会员限度限流功能:

当下载超过100M则限制下载速度为500k

限制web服务器请求数处理为1秒一个,触发值为5,限制用户仅可同时下载一个文件.

如果同时下载超过2个资源,则返回提示 "请联系管理员进行会员充值" 并跳转到其他页面

范例
vim /etc/nginx/conf.d/mirrors.meng.conf 
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; 
limit_conn_zone $binary_remote_addr zone=conn_zone:10m; 
server {
    listen 80; 
    server_name mirrors.meng.org; 
    root /data/mirrors/; 
    charset utf8; 
    autoindex on; 
    autoindex_exact_size off; 
    autoindex_localtime on; 
    limit_req zone=req_zone burst=5 nodelay; 
    limit_conn conn_zone 2; 
    limit_rate_after 100m; 
    limit_rate 500k;
    error_page 503 @error_page; 
    location @error_page { 
        default_type text/html;
        return 200 '温馨提示:请联系管理员进行会员充值!';
       #return 200'Tips: Please contact the administrator for recharge!'; 
       #return https://pan.baidu.com/buy/center?tag=8&from=loginpage#/svip; 
    } 
}
nginx -s reload

在/data/nginx/pc/目录下写两个答文件
dd if=/dev/zero of=f1.img bs=1M count=200
dd if=/dev/zero of=f2.img bs=1M count=200
在另一主机开启两个窗口建立两次连接,进行资源下载
wget http://www.meng.org/f1.img
wget http://www.meng.org/f1.img

在开启第三次下载资源时,下载失败,出现温馨提示
curl http://www.meng.org/f1.img -I
HTTP/1.1 302 Moved Temporarily 
Server: nginx/1.22.0 
Date: Wed, 14 Sep 2022 10:37:19 GMT 
Content-Type: text / html 
Content-Length: 145 
Connection: keep-alive 
Location:温馨提示:请联系管理员进行会员充值!
Nginx状态页
基于nginx模块ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 -- with-http_stub_status_module,否则配置完成之后监测会是提示语法错误
注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

官方文档

http://nginx.org/en/docs/http/ngx_http_stub_status_module.html

格式

Syntax: stub_status; 
Default: — 
Context: server, location

范例:
vim /apps/nginx/conf/conf.d/www.meng.org.conf 
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    location /status {
        stub_status;
        auth_basic      "please input username and password";    提示字符串
        auth_basic_user_file /apps/nginx/conf/.htpasswd;         账户密码文件
    }                                                          以上为状态页加验证
}
nginx -s reload
访问www.meng.org/status 出现下列信息
Active connections: 1              活动链接数,正在连接你的用户
server accepts handled requests    接收 处理 请求 对应下面数量
 71 71 643 
Reading: 0 Writing: 1 Waiting: 0   
解释如下:
Active connections: #当前处于活动状态的客户端连接数,包括连接等待空闲连接数 =reading+writing+waiting
accepts:#统计总值,Nginx自启动后已经接受的客户端请求连接的总数. 
handled:#统计总值,Nginx自启动后已经处理完成的客户端请求连接总数,通常等于accepts,除非有因worker_connections限制等被拒绝的失败连接,即失败连接数=accepts-handled 
requests:#统计总值,Nginx自启动后客户端发来的总的请求数.因为长连接的原因此值大于上面的 accept数 Reading:#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足 Writing:#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大 Waiting:#当前状态,正在等待客户端发出请求的空闲连接数,开启keep-alive 时,Waiting+reading+writing=active connections

范例:分析网站当前的访问量(可以5分钟取值,划出一天的访问量图形,看什么时间段访问量大
curl -s http://meng:123456@www.mengfanchao.com/nginx_status |awk -F: 'NR==1{print $NF}' curl http://meng:123456@www.mengfanchao.com/nginx_status 2 > /dev/null |awk '/Reading/{print $2,$4,$6}'
0 1 15 
curl -s http://meng:654321@www.mengfanchao.com/nginx_status | sed -rn' /Reading/s/Reading:(.*)Writing:(.*)Waiting:(.*)/\1\2\3/p 
echo "Nginx failed TCP connections": $(curl-s http://meng:123456@www.mengfanchao.com/nginx_status | awk 'NR==3 {print $1- $2}')
Nginx第三方模块

第三方模块是对nginx 的功能扩展,第三方模块需要在编译安装Nginx 的时候使用参数--addmodule=PATH指定路径添加,有的模块是由公司的开发人员针对业务需求定制开发的,有的模块是开源爱好者开发好之后上传到github进行开源的模块,nginx的第三方模块需要从源码重新编译进行支持

https://github.com/vozlt/nginx-module-vts
如何下载:进入网站 点击code,找到https,复制路径,下载到指定位置
如:cd /usr/local/src
git clone https://github.com/vozlt/nginx-module-vts.git
[root@ubuntu src]# ls
nginx-1.22.0  nginx-1.22.0.tar.gz  nginx-module-vts
[root@ubuntu ~]# vim /apps/nginx/conf/conf.d/www.meng.org.conf   进行配置
vhost_traffic_status_zone;
server {
    listen 80 ; 
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    vhost_traffic_status_display;             显示第三方模块的状态页
    vhost_traffic_status_display_format html; 状态页用html的格式来显示
}  
在没有编译之前,服务是起不来的
开始编译:
[root@ubuntu ~]# cd nginx-1.23.1/   查看版本
[root@ubuntu nginx-1.23.1]# ./configure --help |grep add   找到--add-module=PATH
--add-module=PATH
[root@ubuntu nginx-1.23.1]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=../nginx-module-vts
编译前先保留老的版本
cp /apps/nginx/sbin/nginx{,.bak}
编译:make && make install
查看执行文件:ll /apps/nginx/sbin/nginx*
-rwxr-xr-x 1 root root 8100480 Sep 15 19:35 /apps/nginx/sbin/nginx*
-rwxr-xr-x 1 root root 8100480 Sep 15 19:35 /apps/nginx/sbin/nginx.bak*
nginx -t 不在报错
nginx -s reload
重启服务:ststemctl restart nginx
访问www.meng.org/status 会出现一个新的状态页画面
echo模块实现信息显示

开源的echo模块可以用来打印信息、变量等

官方文档:

https://github.com/openresty/echo-nginx-module

下载模块
cd /usr/local/src
git clone https://github.com/openresty/echo-nginx-module.git

[root@ubunt src]# ls
echo-nginx-module-master.zip  nginx-1.22.0  nginx-1.22.0.tar.gz  nginx-module-vts

[root@ubunt nginx-1.23.1]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/usr/local/src/nginx-module-vts --add-module=/usr/local/src/echo-nginx-module-master

[root@ubunt nginx-1.23.1]# make && make install

[root@ubunt nginx-1.23.1]# vim /apps/nginx/conf/conf.d/www.meng.org.conf 
vhost_traffic_status_zone;
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    vhost_traffic_status_display;
    vhost_traffic_status_display_format html;
    location /echo {
        echo $request;      #打印请求报文开始行
        echo $uri;          #访问uri,表示网站/下后面所有内容,查询字符串不在uri的表示范围内
        echo $request_uri;  #这个包括查询字符串
    }
}
nginx -s reload
访问:curl http://www.meng.org/echo
或者去网页www.meng.org/echo
显示信息GET /echo HTTP/1.1
/echo
访问curl http://www.meng.org/echo/a/b/c/xxx.html
显示信息GET /echo HTTP/1.1
/echo/a/b/c/xxx.html
访问curl http://www.meng.org/echo/a/b/c/xxx.html?name=meng
显示信息GET /echo HTTP/1.1
/echo/a/b/c/xxx.html?name=meng
Nginx 变量使用

nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用 变量可以分为内置变量和自定义变量 内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值.

内置变量

官方文档

http://nginx.org/en/docs/varindex.html
有大写替换成小写,横线替换成下划线
如      echo $request;            
        echo $uri;           
        echo $request_uri;   
        echo $http_user_agent; 打印用户浏览器版本
        echo $cookie_age;      
访问curl -b 'age=25' http://www.meng.org/echo
GET /echo HTTP/1.1
/echo
curl/7.29.0
25
自定义变量

假如需要自定义变量名称和值,使用指令 set $variable value; 语法格式:

语法格式

Syntax: set $variable value; 
Default: — 
Context: server, location, if

范例
set $name mengfanchao; 
echo $name; 
set $my_port $server_port; 
echo $my_port; 
echo "$server_name:$server_port";
输入信息如下
curl www.meng.org/echo
mengfanchao
80
www.meng.org:80
Nginx自定义访问日志

访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务 器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且Nginx的错误日志一般只有一 个,但是访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路 径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容.

访问日志由 ngx_http_log_module 模块实现,官方文档

http://nginx.org/en/docs/http/ngx_http_log_module.html

语法格式

access_log 
log_format定义日志格式

The Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; 
access_log off; # 关闭访问日志
Default: 
access_log logs/access.log combined;  
Context: http, server, location, if in location, limit_except

日志格式的常见变量
$remote_addr # 记录客户端IP地址 
$remote_user # 记录客户端用户名 
$time_local # 记录通用的本地时间 
$time_iso8601 # 记录ISO8601标准格式下的本地时间 
$request # 记录请求的方法以及请求的http协议 
$status # 记录请求状态码(用于定位错误信息) 
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小 
$bytes_sent # 发送给客户端的总字节数$msec # 日志写入时间.单位为秒,精度是毫秒. 
$http_referer # 记录从哪个页面链接访问过来的 
$http_user_agent # 记录客户端浏览器相关信息 
$http_x_forwarded_for #记录客户端IP地址 
$request_length # 请求的长度(包括请求行,请求头和请求正文). 
$request_time # 请求花费的时间,单位为秒,精度毫秒 
# 注:如果Nginx位于负载均衡器,nginx反向代理之后,web服务器无法直接获取到客 户端真实的IP地址. # $remote_addr获取的是反向代理的IP地址. 反向代理服务器在转发请求的http头信息中, # 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址

默认日志格式写在主配置文件下vim /apps/nginx/conf/nginx.conf
http {                远程客户端地址   用户名         本地时间       请求报文开始头
    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 /apps/nginx/logs/access.log main;  日志路径以及什么格式来记录
自定义默认格式访问日志

如果是要保留日志的源格式,只是添加相应的日志内容,则配置如下:

此指令只支持http块,不支持server块
范例如下:
vim /app/nginx/html/pc/www.meng.org.conf
log_format access_log_format  '$remote_addr - $remote_user [$time_local] "$request" '        '$status $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"'
     '$server_name:$server_port';
server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    access_log /apps/nginx/logs/www.meng.org-access.log   access_log_format;
}
nginx -s reload
查看日志存放路径:多了一个访问日志
[root@ubunt logs]# ls
access.log  error.log  nginx.pid  www.meng.org-access.log  www.meng.org-error.log
进行访问查看日志:
[root@10 ~]# curl http://www.meng.org/
访问成功
[root@ubunt logs]# tail -f www.meng.org-access.log 
10.0.0.165 - - [19/Sep/2022:20:30:38 +0800] "GET / HTTP/1.1" 200 223381 "-" "curl/7.29.0" "-"www.meng.org:80
访问记录写入日志
自定义json格式日志

Nginx 的默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析,生产环境中 通常将nginx日志转换为json日志,然后配合使用ELK做日志收集,统计和分析.

vim /app/nginx/html/pc/www.meng.org.conf
log_format access_log_format  '$remote_addr - $remote_user [$time_local] "$request" '        '$status $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"'
     '$server_name:$server_port';
log_format access_json '{"@timestamp":"$time_iso8601",'
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'
        '"upstreamtime":"$upstream_response_time",'
        '"upstreamhost":"$upstream_addr",'
        '"http_host":"$host",'
        '"uri":"$uri",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"tcp_xff":"$proxy_protocol_addr",'
        '"http_user_agent":"$http_user_agent",'
        '"status":"$status"}';

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    access_log /apps/nginx/logs/www.meng.org-access-json.log   access_json;
}
nginx -s reload

多了一个josn日志
[root@ubunt logs]# ls  
access.log  nginx.pid                     www.meng.org-access.log
error.log   www.meng.org-access-json.log  www.meng.org-error.log
访问并查看日志 
[root@10 ~]# curl http://www.meng.org/
[root@ubunt logs]# tail -f www.meng.org-access-json.log 
{"@timestamp":"2022-09-19T20:51:07+08:00","host":"10.0.0.200","clientip":"10.0.0.165","size":223381,"responsetime":0.001,"upstreamtime":"-","upstreamhost":"-","http_host":"www.meng.org","uri":"/index.html","xff":"-","referer":"-","tcp_xff":"-","http_user_agent":"curl/7.29.0","status":"200"}
可以在网页上找一个josn格式转换工具,把日志贴进去转换就可以读懂了
也可装jq,这个工具可做josn格式转换
[root@ubunt ~]# cat /apps/nginx/logs/www.meng.org-access-json.log |jq
{
  "@timestamp": "2022-09-19T20:51:07+08:00",
  "host": "10.0.0.200",
  "clientip": "10.0.0.165",
  "size": 223381,
  "responsetime": 0.001,
  "upstreamtime": "-",
  "upstreamhost": "-",
  "http_host": "www.meng.org",
  "uri": "/index.html",
  "xff": "-",
  "referer": "-",
  "tcp_xff": "-",
  "http_user_agent": "curl/7.29.0",
  "status": "200"
}
也可安装python3,处理josn日志
dnf -y install python3
cat jons_access.py
#!/usr/bin/env python3 
#coding:utf-8 
status_200= []
status_404= []
with open("/apps/nginx/logs/www.meng.org-access-json.log") as f:
    for line in f.readlines():
        line = eval(line)
        if line.get("status") == "200":
            status_200.append(line.get)
        elif line.get("status") == "404":
            status_404.append(line.get)
        else:
            print("状态码 ERROR")
        print((line.get("clientip")))
f.close()
print("状态码200的有--:",len(status_200))
print("状态码400的有--:",len(status_404))
执行脚本python3 jons_access.py
[root@ubunt ~]# python3 log.py 
10.0.0.165
10.0.0.165
10.0.0.165
状态码200的有--: 3
状态码400的有--: 0
关于favicon.ico
favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错

解决办法:将图标保存到指定目录访问
location = /favicon.ico {
    root /data/nginx/html/pc/images; 
    expires 365d; # 设置文件过期时间 
}
Nginx压缩功能

Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的 文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源.

Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块

官方文档:

https://nginx.org/en/docs/http/ngx_http_gzip_module.html

Syntax:	gzip on | off;
Default:	
gzip off;
Context:	http, server, location, if in location

配置指令如下:

#启用或禁用gzip压缩,默认关闭        gzip on | off;
#压缩比由低到高从1到9,默认为1       gzip_comp_level level;
#禁用IE6 gzip功能                 gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩    gzip_min_length 1k;
#启用压缩功能时,协议的最小版本,默认HTTP/1.1      gzip_http_version 1.0 | 1.1;
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
# 注意 : 来自于ngx_http_gzip_static_module模块
gzip_static on | off;

例如:
vim /apps/nginx/html/pc/www.meng.org.conf
server {
    listen 80 ;
    server_name www.meng.org;   
    root /data/nginx/html/pc/;
    gzip on;                           #开启压缩
    gzip_comp_level 5;                 #压缩比5
    gzip_min_length 1k;                #低于1k不压缩
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/gif image/png;#针对压缩的资源
    gzip_vary on;                      #在响应报文里面添加首部字段
}
nginx -s reload
访问 www.meng.org
查询页面信息,可以查看已经被压缩
https加密
Web网站的登录页面通常都会使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信 息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据.
https实现过程
第一,客户端向服务器发https请求(443端口)
第二,服务器把自己的证书发给客户端,证书其实就是服务器的公钥
第三,客户端验证证书是有效的,生成随机数,如果证书有问题,会弹出警告
第四,客户端利用证书得到的信息,用服务器的公钥对随机数进行加密,传到服务器
第五,因为信息是拿服务器得公钥做的加密,服务器则利用自己的私钥对信息解密,得到随机数
第六,服务器得到随机数后,拿随机数作为后续得会话密钥(即对称密钥)进行加密数据,通讯双方都有随机数,互相就可以通讯了。
阿里云证书使用教程(有阿里云域名不用单独购买证书)
1、登录阿里云--工作台--搜索SSL证书--立即购买(有域名可免费购买20个证书)
2、云解析DNS--点击域名--添加记录--填写主机记录和记录值
2、创建证书--刷新后证书申请--下一步验证DNS信息是否填写正确--提交审核--下载证书给nginx使用
生成key和pem文件
key是私钥
pem是用户的证书和颁发证书的CA的证书
在nginx中使用证书,https 配置参数
nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数 ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启

官方文档

https://nginx.org/en/docs/http/ngx_http_ssl_module.html

 server {
        listen              443 ssl;
        ssl_certificate     /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert.key;
        
Syntax:	ssl on | off;
Default:	ssl off;
Context:	http, server

配置参数如下

#为指定的虚拟主机配置是否启用ssl功能      listen 443 ssl http2;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件    ssl_certificate /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件                   ssl_certificate_key /path/to/file;
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个,最新的浏览器已经不再支持TLS1.0和TLS1.1
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];

#配置ssl缓存 ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
off关闭缓存 none #通知客户端支持ssl session cache,但实际不支持  (建议开启)
builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有,使用此内置缓存可能会导致内存碎片
#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,1M可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称    [shared:name:size]
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5分钟   ssl_session_timeout time;、

范例:
server {
    listen 80 ;
    listen 443 ssl http2;
    ssl_certificate     /apps/nginx/certs/m50.wangxiaochun.com.pem;
    ssl_certificate_key /apps/nginx/certs/m50.wangxiaochun.com.key;
    server_name m50.wangxiaochun.com;
    root /data/nginx/html/pc/;
}
[root@ubunt certs]# mkdir /apps/nginx/certs/ 创建存放证书的目录
把申请的证书拉到这个目录
[root@ubunt certs]# ls
m50.wangxiaochun.com.key  m50.wangxiaochun.com.pem
配置里面路径写证书的路径,且为哪个网站申请的证书,就填写哪个网站域名,如果不一致,会报警告。
nginx -s reload
访问:http://m50.wangxiaochun.com/
访问:https://m50.wangxiaochun.com/
成功   可以改成crt后缀在windows上查看证书详细信息

也可用自生成证书做网站的证书

范例
脚本生成两个证书(颁发给www.meng.org)
查看证书并改成和网站一样的名
[root@ubunt data]# lsmeng.org
cacert.pem  master.crt  master.key  slave.crt  slave.key
cakey.pem   master.csr  slave.csr
[root@ubunt data]# mv master.key www.meng.org.key
[root@ubunt data]# cat master.crt cacert.pem > www.meng.org.pem
[root@ubunt data]# mv www.meng.org.* /apps/nginx/certs/
[root@ubunt certs]# ls
www.meng.org.key  www.meng.org.pem
[root@ubunt ~]# vim /apps/nginx/conf/conf.d/www.meng.org.conf
server {
    listen 80 ;
    listen 443 ssl http2;
    ssl_certificate     /apps/nginx/certs/www.meng.org.pem;
    ssl_certificate_key /apps/nginx/certs/www.meng.org.key;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
}
[root@ubunt ~]# nginx -s reload
去网站访问可以了。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   31   0   0 nginx客户端服务端
  stLBpDewCLT1   2023年12月08日   30   0   0 nginx
  jnZtF7Co41Wg   2023年12月10日   22   0   0 nginx客户端服务端NFS
  eHipUjOuzYYH   2023年12月06日   29   0   0 nginxHTTP
  eHipUjOuzYYH   2023年12月06日   26   0   0 nginx加载IPV6
  9JCEeX0Eg8g4   2023年12月11日   26   0   0 mysql配置文件