本文目录
一、Nginx的简介
1.什么是 nginx 和可以做什么事情
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
- 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
2.Nginx的web优势
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。
①IO多路复用 (I是输入,O指输出 )
技术类型:poll、epoll
epll可以说是IO多路复用最新的一个实现,特点是:异步,非阻塞
②时分多路复用
③频分多路复用
3. 正向代理
Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
- 简单一点:通过代理服务器访问服务器的过程就叫正向代理。
- 需要在客户端配置代理服务器进行指定网站访问
4. 反向代理
- 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。
- 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
5. 负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能 满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量 是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
6.动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、Nginx的安装(Linux:centos为例)
官网地址:http://nginx.org/
1.安装nginx
- 添加 nginx 官方提供的 yum 源(需要联网且时间较长)
rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.2-1.el7_4.ngx.x86_64.rpm
- 使用 yum 安装 nginx(前提要装好yum源)
yum install nginx
2.启动nginx
启动nginx,如下所示,访问成功
[root@nginx ~]# systemctl start nginx [root@nginx ~]# curl -I 192.168.206.129:80 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Sun, 07 Apr 2024 02:42:38 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sun, 07 Apr 2024 02:23:22 GMT Connection: keep-alive ETag: "6612039a-264" Accept-Ranges: bytes [root@ansible ~]#
三、Nginx 配置文件
所有文件命令:
rpm -ql nginx
- /etc/logrotate.d/nginx #日志轮转
- /etc/nginx/nginx.conf #主配置文件
- /etc/nginx/conf.d #子配置文件夹
- /etc/nginx/conf.d/default.conf #默认的网站配置文件
- /etc/nginx/fastcgi_params #动态网站模块文件-python,php所需的相关变量
- /etc/nginx/mime.types #文件关联程序 网站文件类型 和 相关处理程序
- /etc/nginx/modules #模块文件夹。第三方模块
- /usr/lib/systemd/system/nginx.service #服务脚本
- /usr/sbin/nginx #主程序
- /var/cache/nginx #缓存各种
- /var/log/nginx #日志文件夹 access.log 是访问日志 、 error.log是错误日志
四、Nginx 编译参数
Nginx 编译参数:
nginx -V
基本配置:
configure afguments: 配置参数
--prefix=/etc/nginx 安装路径
--sbin-path=/usr/sbin/nginx 程序文件
--modules-path=/usr/lib64/nginx/modules 模块路径
--conf-path=/etc/nginx/nginx.conf 主配置文件
--error-log-path=/var/log/nginx/error.log 错误日志
--http-log-path=/var/log/nginx/access.log 访问日志
--pid-path=/var/run/nginx.pid 程序ID
--lock-path=/var/run/nginx.lock 锁路径,防止重复启动ngxin
--http-client-body-temp-path=/var/cache/nginx/client_temp 缓存
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 代理缓存
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp php 缓存
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp python 缓存
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--with-compat 启动动态模块兼容性
--user=nginx 用户
--group=nginx 组
模块类:
configure afguments: 配置参数
--with-file-aio 异步非阻塞
--with-threads 多线程模块
--with-http-addition_module 追加模块
--with-http-autch_request_module 认证模块
--with-http-dav_module 增加上传PUT.DELETE.MKCOL
--with-http-flv_module NGINX添加MP4、FLV视频支持模块
--with-http-gunzip_module 压缩模块
--with-http-gzip_static_module
--with-http-mp4_module 多媒体模块
--with-http-random_index_module 随机主页模块
--with-http- realip_module Nginx获取真实IP模块
--with-http-slice_module Nginx中文文档
--with-http-ssl_module 安全模块
--with-http-stud_status_module 访问状态
--with-http-sub_module Nginx替换网站响应内容
--with-http-v2_module
--with-mail 邮件客户端
--with-stream 反向代理,负载均衡
--with-stream_realip_module 反向代理,负载均衡
--with-stream_ssl_module 反向代理,负载均衡
--with-stream_ssl_preread_module 反向代理,负载均衡
五、Nginx基础配置
1.观察主配置文件
vim /etc/nginx/nginx.conf
1 1~6 核心模块(进程数等)
2 user nginx;
3 worker_processes auto;
4
5 error_log /var/log/nginx/error.log notice;
6 pid /var/run/nginx.pid;
7
8 9~11 事件驱动模块(工作模式)
9 events {
10 worker_connections 1024;
11 }
12
13 14~32 http内核模块(文档程序类型,配置文件等)
14 http {
15 include /etc/nginx/mime.types;
16 default_type application/octet-stream;
17
18 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
19 '$status $body_bytes_sent "$http_referer" '
20 '"$http_user_agent" "$http_x_forwarded_for"';
21
22 access_log /var/log/nginx/access.log main;
23
24 sendfile on;
25 #tcp_nopush on;
26
27 keepalive_timeout 65;
28
29 #gzip on;
30
31 include /etc/nginx/conf.d/*.conf;
32 }
2.观察默认虚拟主机配置文件(子配)
vim /etc/nginx/conf.d/default.conf
1 server {
2 listen 80; #服务器端口号
3 server_name localhost; #服务器域名
4
5 #access_log /var/log/nginx/host.access.log main; #访问日志的存放位置
6
7 location / { #location指位置,指网站主页位置
8 root /usr/share/nginx/html; #root指表达网站的根目录在哪里,后面即跟着路径
9 index index.html index.htm; #index指主页名字
10 }
11
12 #error_page 404 /404.html;
13
14 # redirect server error pages to the static page /50x.html
15 #
16 error_page 500 502 503 504 /50x.html;
17 location = /50x.html {
18 root /usr/share/nginx/html;
19 }
20
21 # proxy the PHP scripts to Apache listening on 127.0.0.1:80
22 #
23 #location ~ \.php$ {
24 # proxy_pass http://127.0.0.1;
25 #}
26
27 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
28 #
29 #location ~ \.php$ {
30 # root html;
31 # fastcgi_pass 127.0.0.1:9000;
32 # fastcgi_index index.php;
33 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
34 # include fastcgi_params;
35 #}
36
37 # deny access to .htaccess files, if Apache's document root
38 # concurs with nginx's one
39 #
40 #location ~ /\.ht {
41 # deny all;
42 #}
43 }
3.启动一个新的虚拟主机
vim /etc/nginx/conf.d/xuleilinux.conf #文件名后缀必须是 .conf #输入以下内容 server { listen 80; server_name xuleilinux.com; location / { root /xuleilinux; index index.html; } }
重启服务器
systemctl restart nginx
然后新建配置文件里所需要的文件夹及文件
mkdir /xuleilinux echo "美男子" > /xuleilinux/index.html
最后字符浏览器测试
vim /etc/hosts 域名解析 192.168.206.129 xuleilinux.com yum -y install elinks #安装一个字符浏览器 elinks http://xuleilinux.com #字符浏览器访问xuleilinux.com,界面出现 "美男子",实验完成
或者真机测试
C:\Windows\System32\drivers\etc\hosts 真机域名解析 192.168.206.129 xuleilinux.com 打开浏览器输入:xuleilinux.com ,界面出现"美男子",实验成功
六、Nginx Log
1.日志配置
①相关指令
log_format 日志格式 error_log
②日志的格式和命令 -log_format
简介:Nginx有非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format 命令定义。
③定义设置位置
vim /etc/nginx/nginx.conf 18 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 19 '$status $body_bytes_sent "$http_referer" ' 20 '"$http_user_agent" "$http_x_forwarded_for"';
日志格式允许包含的变量
$remote_addr 远程地址:记录客户端IP地址 $remote_user 远程用户:记录客户端用户名称 [$time_local] 本地时间:服务器自身时间 $request 请求:记录请求的URL和HTTP协议 $status 状态:记录请求状态 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小 $http_referer 记录从哪个页面链接访问过来的(超链接) $http_user_agent 记录客户端代理(浏览器)相关信息 $http_x_forwarded_for 代理IP
④案例 error_log
个性化404
vim /etc/nginx/conf.d/xuleilinux.conf server { listen 80; server_name xuleilinux.com; location / { root /xuleilinux; index index.html; } error.page 404 /404/html; #新增9~11行即可实现个性化404。page意思是页面 插入图片命令:<img src="404.jpg" /> location = /404.html { root /xuleilinux; #指404.html在root下xuleilinux里面 } }
⑤日志缓存
简介:大量访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭,占用了系统的IO,但是与业务无关。
可以使用open_log_file_cache 来设定
syntax:
open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m;
- 释义: max 1000 指的是日志文件的FD,最大的缓存数量为1000 。 如果超了怎么办,看下面】
min_uses=3 20秒内小于3次访问的FD,就给你清掉,结合inactive=20s的时间。
valid=1m 检查周期为1分钟
- 总结:缓存最多1000个,到了极限,每分钟开始清除掉20秒以内访问小于3次的文件FD
2.日志轮转&切割
观察日志轮转文件
vim /etc/logrotate.d/nginx 1 /var/log/nginx/*.log { 2 daily 天 3 missingok 丢失不提示 4 rotate 52 52份 5 compress 压缩 6 delaycompress 延迟压缩 7 notifempty 空文件的话,不转储 8 create 640 nginx adm 日志切割之后,新建一个文件、权限640、以nginx为主,adm为组 9 sharedscripts 9~14行指的是重启 10 postrotate 11 if [ -f /var/run/nginx.pid ]; then 12 kill -USR1 `cat /var/run/nginx.pid` 13 fi 14 endscript 15 }
3. 日志分析
①常用字段
$remote_addr $1
[$time_local] $4
$request $7
$status $9
$body_bytes_sent $10
②日志查找统计
案例1 :统计2023年2月9号的 PV 量
grep '09/Feb/2023' access.log | wc -l
统计2023年2月9号8点与9点之间的 PV 量
grep '09/Feb/2023:08' access.log | wc -l
awk '$4>="[09/Feb/2023:08:00:00" && $4<="[09/Feb/2023:09:00:00" {print $0} ' access.log | wc -l
案例2:统计2023年2月9日,一天内访问最多的10个IP
grep '09/Feb/2023' access.log | awk '{ips[$1]++}END{for(i in ips){print i,ips[i]}}' | sort -k2 -rn |head -10
案例3:统计2023年2月9日,访问大于100次的IP
grep '09/Feb/2023' access.log | awk '{ips[$1]++}END{for (i in ips) {if(ips[i]>100){print i,ips[i]}}}' |sort -k2
案例4:统计2023年2月9日,访问最多的10个页面
grep '09/Feb/2023' access.log | awk '{ips[$7]++}END{for (i in ips){print i,ips[i]}}' | sort -k2 -rn | head -10
案例5:统计2023年2月9日,每个URL访问内容总大小
grep '09/Feb/2023' access.log | awk '{urls[$7]++;size[$7]+=$10} END{for(i in urls){print urls[i],size[i],i}}' # size[$7]=$10指前面的第七列等于第十列,size[$7]+=$10指多了个加号,每次第十列的值都会叠加
案例6:统计2023年2月9日,每个IP访问状态码数量
grep '09/Feb/2023' access.log | awk '{status[$1" "$9]++}END{for (i in status){print i,status[i]}}'
案例7:统计2023年2月9日,每个IP访问状态码为404及出现次数
grep '09/Feb/2023' access.log | awk '{if($9="404"){status[$1" "$9]++}} END{for (i in status){print i,status[i]}}'
案例8:统计前一分钟的PV量
xuleidate=`date -d '-1 minute' +%Y:%H:%m` ; awk -v xudate=$xuleidate '$0 ~ xudate{i++} END{print i}' access.log #把变量xuleidate调用到awk里进行查找文件,~表示像不像
七、 Nginx Web模块
1.连接状态 stub_status_module
1.1目的:
展示用户和nginx链接数量信息
1.2查询模块是否安装:
nginx -V 2>&1 | grep stub_status
1.3启动状态模块
1.3.1访问默认站点的状态模块(错误验证)
http://192.168.206.129/nginx_status
1.3.2配置状态模块
vim /etc/nginx/conf.d/default.conf 再server{ }里面添加以下内容 location /nginx_status{ stub_status; #打开该模块 allow all; #开通所有权限 }
然后再次访问该页面
http://192.168.145.135/nginx_status 出现以下界面 Active connections: 2 #活跃的连接,指有多少人在连你 server accepts handled requests #服务器接收已处理的请求 4 4 20 # 总连接数 / 成功的连接数 / 总共处理的请求数 Reading: 0 Writing: 1 Waiting: 1
1.3.3关于链接的问题
①什么是链接?
- TCP封装结构?
- TCP三次握手?
- TCP四次挥手/四次断开?
②什么是请求?
一次HTTP查询
③keepalived (保持活跃)
长连接设置
vim /etc/nginx/nginx.conf 打开主配置文件,找下长连接设置一行 keepalive_timeout 65; # 可通过修改65来调整长连接的时间。65 代表长连接时间
2.随机主页模块 random_index_module
2.1目的:
将主页设置成随机页面,是一种微调更新机制
2.2启动随机主页:
先创建主页目录
mkdir /app
创建多个主页
touch /app/{1.html,2.html,3.html,.4.html} # .4.html 前面加了.表示这个文件为隐藏文件 在不同的页面书写不同的内容
启动随机主页
vim /etc/nginx/conf.d/default.conf 把14~16内容替换掉 14 location / { 15 root /usr/share/nginx/html; 16 index index.html index.htm; 17 } 替换成以下 14 location / { 15 root /app; 16 random_index on; 17 }
重启服务器
systemctl restart nginx
最后真机浏览器测试即可
192.168.206.129 页面会随机显示上面创建的三个文件夹里的内容
3.替换模块 sub_module
3.1目的:
网页内容替换
3.2启动模块:
vim /etc/nginx/conf.d/default.conf 先启动默认主页,如下面4行内容 location / { root /usr/share/nginx/html; index index.html index.htm; } 然后在server开头重新添加如下2行内容 sub_filter nginx 'yunpeng'; #指将nginx替换为yunpeng sub_filter_once off; #如果不加sub_filter_once off; 这条命令,默认指替换一次内容。off指关闭,也就是替换所有内容
- 没有添加sub_filter_once off; 该命令的效果(只替换了一次)
- 添加了sub_filter_once off; 该命令的效果(替换了所有内容)
重启服务器
systemctl restart nginx
最后真机浏览器重新访问
192.168.206.129 效果如上面两种图
4.文件读取
4.1模块统称:ngx_http_core_module
语法:
sendfile on; 发送文件 tcp_nopush on; 不推送 tcp_nodelay on; 无延迟
原理解释:
sendfile on; 使用或未使用sendfile的传统网络传输过程 tcp_nopush on; 使用或未使用tcp_nopush网络资源浪费 当包累计到一定大小后发送 tcp_nodelay on; 使用或未使用tcp_nodelay网络传输效率提升 tcp_nodelay on是禁用Nagle算法,即数据包立即发出去
位置:
vim /etc/nginx/nginx.conf
5.文件压缩
5.1原理:
启动该模块,使文件传输前进行压缩,提升传输效率
5.2模块: ngx_http_gzip_module
5.3启动模块
vim /etc/nginx/nginx.conf 打开主配置文件找到HTTP{},在里面输入以下内容 gzip on; gzip_http_version 1.1; #用1.1版本进行压缩 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #压缩对象 gzip_static on; #静态压缩开启
6.页面缓存
6.1模块:
ngx_http_headers_module
6.2语法
expires [modified] time;
6.3启动缓存
- 开启浏览器缓存,浏览页面:第一次返回状态码200,页面对象全文传输
第二次返回状态码304,页面对象部分传输
6.4开启服务器缓存模块
vim /etc/nginx/conf.d/default.conf 在location{} 主页模块里添加 expires 24h; location / { expires 24h; #指24小时以内均为部分传输即本地缓存传输 root /usr/share/nginx/html; index index.html index.htm; }
7.防盗链
7.1模块:
ngx_http_referer_module
7.2语法
valid_referers none | brocked | server_names | string ...;
7.3启动防盗链
展现盗链现象
touch /etc/nginx/conf.d/a.com.conf /etc/nginx/conf.d/b.com.conf 新建两个网站,a.com和b.com vim /etc/nginx/conf.d/a.com.conf 进入a.com网站配置服务器和网页主目录位置 server { listen 80; server_name a.com; location / { root /a.com; index index.html; } } vim /etc/nginx/conf.d/b.com.conf 进入b.com网站配置服务器和网页主目录位置 server { listen 80; server_name b.com; location / { root /b.com; index index.html; } }
vim /a.com/index.html 编辑a.com网站的主页内容 <img src='1.jpg'/> vim /b.com/index.html 编辑b.com网站的主页内容,主页内容盗用a.com网站主页上的图片 <img src='http://a.com/1.jpg'/>
注:真机域名解析后然后访问a.com会显示图片。再访问b.com时同样会显示出a.com主页上的图片,这就是盗用
7.4启动a.com网站防盗链功能
先把a.com和b.com的两个网站的access.log分开
vim /etc/nginx/conf.d/a.com.conf 将第3行内容添加到server里面 server { access_log /var/log/nginx/a.com.access.log main; vim /etc/nginx/conf.d/b.com.conf 将第7行内容添加到server里面 server { access_log /var/log/nginx/b.com.access.log main;
将a.com网站上的资料锁住,其它人不能盗链
vim /etc/nginx/conf.d/a.com.conf 打开a.com网站,在location主页一栏里面添加3~7行 location / { valid_referers none blocked *.a.com; #可用 的 引用 没有 锁住 if ($invalid_referer){ return 403; } root /a.com; index index.html; }
如果希望某些网站能够使用(盗链)资源
vim /etc/nginx/conf.d/a.com.conf 在锁住的后面加上server_name,后面跟着能够使用盗链网站的名称即可合法使用盗链 valid_referers none blocked *.a.com server_name ~\.google\. ~\.baidu\. a.com 192.168.206.* ;
八、Nginx访问限制
1.模块一
ngx_http_limit_req_module limit限制 req 指requst请求
目的:启动请求频率限制
测试未限制情况下的访问
yum -y install httpd-tools 安装网站工具 ab -n 100 -c 10 http://a.com/ #an是压测工具名,-n指发起数量100次 , -c指分10次发送 ,a.com后面要加根目录
启动限制。先在主配文件里定义该模块
vim /etc/nginx/nginx.conf 打开主配置文件,在http{}里面添加以下内容 limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; #限制 请求 区域 二进制 远程 地址 区域 占用10M空间 允许每秒1次请求
然后在需要测试的网站配置文件里引用上方定义模块
vim /etc/nginx/conf.d/a.com.conf 在location {}里面添加以下内容 limit_req zone=req_zone; #引用 限制请求的名称
重启服务器
systemctl restart nginx
测试已限制情况下的访问
ab -n 100 -c 10 http://a.com/
2.模块二
ngx_http_limit_conn_module #conn 连接器
目的:通过IP地址,限制连接(TCP)
启动连接频率限制
vim /etc/nginx/nginx.conf 打开主配置文件,在http{}里面添加以下内容 limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
然后在需要测试的网站配置文件里引用上方定义模块
vim /etc/nginx/conf.d/a.com.conf 在location {}里面添加以下内容 limit_conn conn_zone 1; #单个IP,同时只允许有一个TCP连接
九、访问控制
1.基于主机(ip)
①模板
ngx_http_access_module
②语法
allow 允许某些主机 deny 拒绝某些主机
③启动控制
a.com网站限制主机访问
vim /etc/nginx/conf.d/a.com.conf 打开配置文件,在server{}里面开头添加2~4行内容 allow 192.168.145.1; #允许多个主机连接要在下一行里添加,不能并排写在后面 allow 192.168.145.136; deny all; #all指拒绝剩余的所有主机
2.基于用户(username$password)
①模块
ngx_http_auth_basic_module #auth认证 basic 基础信息
②启动控制
建立认证文件
yum -y install httpd-tools htpasswd -cm /etc/nginx/conf.d/passwd user10 # 网站密码 -c创造 m加密 路径 user10用户 htpasswd -cm /etc/nginx/conf.d/passwd user20 cat /etc/nginx/conf.d/passwd
在配置文件里引用上方文件
vim /etc/nginx/conf.d/a.com.conf 在server{} 里面添加2~3行内容 auth_basic "lai la laotei"; #"lai la laotei"是页面提示语,可能会不显示 auth_basic_user_file /etc/nginx/conf.d/passwd; #引用认证文件
重启服务器
systemctl restart nginx
真机浏览器重新访问a.com网站时,会跳出验证信息需要填写账号和密码才能访问
十、HTTP 协议详解
1.HTTP
超文本传输协议,是一种建立在TCP上的无状态连接。整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务器收到请求后,服务端开始处理请求,并根据请求作出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事务结束后,还会在服务端添加一条日志条目。
2.URI
是统一资源标识符。HTTP请求的内容通称为“资源”。 每个资源都由一个(URI)来进行标识。URL即统一资源定位符,它是URI的一种。一份文档,一张图片,或所有其它。URI 包括URL 、URN。
3.URN
是另一种形式的URI,它通过特定命名空间中的唯一名称来标识资源。
======================================================================
======================================================================
物理层 数据链路层 网络层 传输层 应用层
物理层:前导符起始帧定位符
数据链路层:数据帧:源MAC 目标MAC地址
网络层:IP地址,逻辑寻址:源IP 目标IP
传输层:可靠性:端口号,序列号,确认号
应用层:HTTP URL http://www,kengni.com/1.jp
十一、Nginx-proxy 代理服务器
1.代理原理
内网客户机通过代理访问互联网。通常要设置代理服务器地址和端口。
2.proxy 模块
语法:
代理
proxy_pass URL; 代理的后端服务器URL
缓冲区
proxy_buffering on | off; 缓冲开关
proxy_buffer_size 4k | 8k; 缓冲区大小
proxy_buffer number size; 缓冲区数量
proxy_busy_buffer_size size; 忙碌的缓冲区大小,控制同时传递给客户端的buffer数量
3.启动代理
环境:需要两台nginx真实服务器
192.168.145.137 作为 网站服务器
192.168.145.136 作为 代理服务器
在代理服务器配置文件里启动代理模块,在location {}里面注释掉代理服务器上的主页和主目录,然后添加7~16行的内容 vim /etc/nginx/conf.d/default.conf location / { # root /usr/share/nginx/html; # index index.html index.htm; proxy_pass http://192.168.145.137; proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; }
4.proxy 缓存
①模块
语法: 缓存开关 proxy_cache zone proxy_cache_path path [levels=levels] 代理缓存 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m #代理器缓存路径 存放位置 用二级目录 10M空间 缓存维度 proxy_cache_key string #定义缓存唯一Key,通过唯一key来进行hash存取,缓存文件名 缓存过期 proxy_cache_valid 200 302 10m #缓存200 302 十分钟 proxy_cache_valid 404 10m #缓存404 一分钟
②启动缓存
延续代理实验
设置代理服务器(192.168.145.136)
vim /etc/nginx/nginx.conf 在http{}开头添加 proxy_cache_path /app/qianfeng/cache levels=1:2 keys_zone=proxy_cachexulei:10M max_size=10g inactive=60m use_temp_path=off; #proxy_cachexulei指缓存区的名字 max_size指缓存空间大小 inactive指不活跃60分钟 use_temp_path指使用临时路径 新建代理缓存存放文件夹 mkdir -p /app/qianfeng/cache
vim /etc/nginx/conf.d/default.conf 在location{}里面添加 proxy_cache proxy_cachexulei; #调用缓存策略 proxy_cachexulei为主配文件里自己建的名称 proxy_cache_valid 200 304 12h; #对200和304的状态码缓存12小时 proxy_cache_valid any 10m; #除了上面的,其它的缓存10分钟 proxy_cache_key $host$uri$is_args$args; #定义缓存唯一Key,通过唯一key来进行hash存取 add_header Nginx-Cache "$upstream_cache_status"; #在回给用户的时候将缓存的状态回给用户 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; #后端服务器报500 505 503 504错误时会跳到下一个后端服务器
重启代理服务器
systemctl restart nginx
5.验证
- 最后在真机上访问代理服务器192.168.145.136 ,即可访问到nginx主页,即代理成功。
- 在观察浏览器上的缓存状态码为HIT,即proxy缓存设置成功
访问第一次,状态码是 miss , 表示未击中缓存(代理服务器上未找到缓存)
访问第二次,状态码是 HIT ,表示击中缓存 (代理服务器上找到了该URL的缓存)