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
去网站访问可以了。