文章目录
Web—http/Nginx
http
访问网站:通过网站的IP地址访问,也可以用域名访问(因为IP地址不易记忆)
域名结构: 主机名.子域.二级域.顶级域.
(根域)
域名解析: 先使用本地的 hosts 文件,如果没有相关记录再使用 DNS 解析
DNS解析过程: 客户端 -> 本地域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 二级域名/子域名服务器 -> 根据主机名解析出IP (查询方式:递归查询、迭代查询)
网页文件 html文件(文件名后缀通常以 .html 或 .htm 结尾)
html网页文件基本格式
<html>
<head> #网页的标题部分
<title>.....</title>
</head>
<body> #网页的内容部分
<p>......</p> #整行内容
</br> #换行
<img src="图片路径" /> #插入图片
</body>
</html>
静态网页和动态网页的区别
静态网页:就是 标准的HTML网页,网页文件后缀通常以 .html .htm .shtml 等结尾。没有后台数据库支持,不包含任何应用程序,网页不可交互,网页URL路径中不含有 ?
动态页面:有后台数据库支持,网页可交互,也可以自动更新,网页内容会包含用 php java python 等高级编程语言编写的应用程序,网页URL路径中会含有 ? 用于传参
http协议
http协议版本
http1.0 只支持短连接(在一个TCP连接中只能完成一次http请求和响应过程)
http1.1 支持长连接(连接保持、持久连接)和管道机制,即支持在一个TCP连接中可完成多次http请求和响应,且要求按照顺序一一对应
http2.0 支持长连接和多路复用,即支持在一个TCP连接中可完成多次http请求和响应,且不用按照顺序一一对应;还支持网页头部压缩和服务端主动推送;使用二进制格式代替文本格式
http3.0 基于UDP协议实现。具有更高的传输效率
请求方法
GET 发送查询资源请求,用于查询、读取、下载资源内容
PUT 向服务器提交资源,用于修改资源内容
POST 向服务器提交资源,用于添加资源内容
DELETE 用于删除资源内容
HEAD 用于查询网页的头部信息和元数据
响应状态码
正常的响应状态码 1XX(提示信息) 2XX(正常处理) 3XX(重定向)
异常的响应状态码 4XX(客户端请求错误) 5XX(服务器请求错误)
200 一切正常
301 永久重定向
302 临时重定向
400 客户端请求的语法错误或格式不正确
401 客户端认证失败,通常是因为提供的账号密码错误
403 客户端请求被拒绝,通常是因为没有权限访问
404 客户端请求的文件不存在,通常是因为客户端请求的路径有误
500 服务器内部错误,通常是因为服务器程序错误、配置问题或资源不足导致
502 无效网关,通常是因为网关代理服务器收到后端上游服务器返回的无效响应消息导致
503 服务可不用,通常是因为临时的服务器维护或者过载,服务器当前无法处理请求导致
504 网关超时,通常是因为网关代理服务器收到后端上游服务器未在规定时间内返回响应消息导致
请求报文
请求行 包含请求方法、请求的URL路径、http协议版本
请求头 键值对类型的元数据信息
请求体 包含向服务器提交的数据
响应报文
响应行 包含http协议版本、响应状态码和描述
响应头 键值对类型的元数据信息
响应体 包含服务器返回的网页数据
Ngnix
Apache和Nginx区别
最核心的区别在于
nginx 采用的是 异步非阻塞机制,一个进程可以同时处理多个连接;
apache 采用的是 同步阻塞+多进程/多线程模型,一个进程只能同时处理一个连接
nginx 抗并发能力更高(处理 2-3 万并发连接数,最高能支持 5 万并发);
更轻量; CPU、内存资源消耗更少;
配置简洁,使用场景多,性能稳定
nginx 进程
master进程:管理worker进程,加载配置文件
worker进程:处理连接请求
最大并发如何设置
nginx应用程序配置 nginx.conf worker_processes(设置工作进程数,一般为与CPU数量相同或auto) worker_connections(每个worker进程能够处理的连接数)
worker_rlimit_nofile(设置每个worker进程最大可以打开的文件数)
linux操作系统配置 ulimit -SHn 65535 #指定进程能够打开的文件数
/etc/security/limits.conf * soft nofile 65535
* hard nofile 65535
页面跳转
location
匹配用户访问请求的URL路径(优先最长匹配),跳转页面
root(根目录配置)
location /abc {
root /var/www;
}
处理方式:root路径 追加 location路径 http://192.168.80.20/abc/xy103/test.html --> /var/www/abc/xy103/test.html
location /abc/xy103 {
root /var/www;
}
http://192.168.80.20/abc/xy103/test.html --> /var/www/abc/xy103/test.html
alias(别名目录配置)
location /abc {
alias /var/www;
}
处理方式:alias路径 替换 location路径 http://192.168.80.20/abc/xy103/test.html --> /var/www/xy103/test.html
location /abc/xy103 {
alias /var/www;
}
http://192.168.80.20/abc/xy103/test.html --> /var/www/test.html
rewrite
地址重写调转页面
格式
rewrite 正则表达式 重写的地址 标记位;
last break permanent redirect
rewrite默认情况下只对从域名后面的根目录 / 开始到传递参数的 ? 号前面的URL路径进行重写
rewrite ^/ /新URL地址; http://域名/旧URL地址 --> http://域名/新URL地址 #默认只对域名后的URL地址重写
rewrite ^/ http://新域名/新URL地址; http://旧域名/旧URL地址 --> http://新域名/新URL地址 #如果要全路径重写,需要加上协议和新的域名
rewrite ^/(.*)$ http://新域名/$1; http://旧域名/旧URL地址 --> http://新域名/旧URL地址 #仅对域名进行重写,URL路径不变
rewrite ^/ /新URL地址 permanent; #重写后会修改浏览器地址栏再重新访问
rewrite重写后访问过程
rewrite 正则表达式 /新URL地址;
http://域名/旧URL 重写成 http://域名/新URL 后直接在nginx内部匹配相关配置跳转页面
rewrite 正则表达式 /新URL地址 permanent;
http://域名/旧URL 重写成 http://域名/新URL 浏览器地址栏也会改为 http://域名/新URL 并再次发送访问请求给nginx --> 重新匹配nginx相关配置跳转页面
注:如果rewrite配置不当可能会导致死循环
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^/(.*) http://www.xy103.com/$1 permanent;
}
此时 http://www.xy103.com 访问任何网页都会访问出错
匹配URL路径的方式:
一
location ~ URL访问路径正则表达式 {
rewrite .... ;
}
二
if ($uri ~ URL访问路径正则表达式) {
rewrite .... ;
}
访问状态统计
1)安装nginx时添加状态统计模块 ./configure --with-http_stub_status_module
2)修改nginx配置文件,开启状态统计功能 stub_status on; access_log off;
3)测试验证 curl -s ....
访问认证
1)安装 httpd-tools 工具,使用 htpasswd 生成用户密码文件,并修改文件的归属为nginx和权限为400
2)修改nginx配置文件,添加 auth_basic 和 auth_basic_user_file 配置
3)使用浏览器测试验证
访问控制
在 http{} 配置块(对所有站点生效) server{} 配置块(对当前的server站点的所有访问路径生效) location{} 配置块(只对当前的server站点的指定URL访问路径生效) 中添加配置
allow IP或网段; #允许指定的IP或网段访问
deny IP或网段; #拒绝指定的IP或网段访问
黑名单配置: deny IP或网段;
白名单配置: allow IP或网段;
deny all;
网站虚拟主机
可实现在一个服务器上部署多个网站站点,充分利用服务器的硬件资源
基于域名的虚拟主机
server {
server_name XXX; #在不同的server配置块中设置不同的域名
}
基于IP的虚拟主机
server {
listen <IP>:端口; #在不同的server配置块中设置不同的监听IP地址
}
基于端口的虚拟主机
server {
listen IP:<端口>; #在不同的server配置块中设置不同的监听端口
}
应用场景
- 用作web网站服务,处理静态网页请求
- 用做虚拟主机,实现在一个服务器上部署多个网站站点
- 用作反向代理、负载均衡,可作为网关代理服务器接受客户端的请求再转发给后端上游服务器处理
- 用作web缓存服务器,缓存经常被访问的静态网页资源
yum安装Nginx
配置yum源
cd /etc/yum.repos.d
将所有源移入备份文件bak
将nginx源移入
nginx.repo
保证能ping通网络
ping www.baidu.com
yum安装nginx
yum install -y nginx
开启服务
systemctl start nginx
查看端口
netstat -lntp | grep nginx
nginx -v # 显示版本号
nginx -V # 显示版本号、详细参数
编译安装Nginx
本机浏览器搜索https://nginx.org/en/download.html
此处下载了 nginx-1.26.2.tar.gz
将安装nginx所需软件包传到/opt目录下
cd /opt
nginx-1.26.2.tar.gz
解压
tar xf nginx-1.26.2.tar.gz
使用本地yum源安装依赖包
yum install -y pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
创建运行用户
useradd -M -s /sbin/nologin nginx
编译安装
cd /opt/nginx-1.26.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make -j 2
make install
优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx优化
配置文件优化
性能优化
开启网页压缩 gzip on;
网页缓存 expires 缓存时间;
连接保持超时 keepalive_timeout 服务端超时时间 客户端超时时间;
连接保持最大请求次数 keepalive_requests
工作进程数 worker_processes(与服务器CPU数量相同或auto)
工作进程连接数 worker_connections
工作进程打开文件数 worker_rlimit_nofile
工作进程静态绑核 worker_cpu_affinity
IO多路复用模型 use epoll;
启用内核复制模式(可用于提高文件下载传输效率) sendfile on; tcp_nopush on; tcp_nodelay;
连接优化
multi_accept on;(让工作进程可以尽可能多的接收连接请求) accept_mutex on;(以串行方式接入新连接,防止惊群问题)
安全优化
隐藏版本号 server_tokens off;
防盗链 先用valid_referers设置信任的跳转路径,再用if($invalid_referer)对不信任的跳转来的路径进行rewrite地址重写或直接return返回403页面
访问控制 通过脚本分析访问日志,使用 deny 攻击主机的IP 设置加入黑名单进行访问控制
设置运行用户/组(对网站文件读取时使用专用账户进行访问控制) user 用户名 组名;
限制连接数 limit_conn_zone limit_conn
限制请求速率 limit_req_zone limit_req
系统内核优化
/etc/security/limits.conf 内核资源限制文件
- soft nofile 65535 #进程打开文件数 ulimit -n
- hard nofile 65535
- soft nproc 65535 #打开的系统进程数 ulimit -u
- hard nproc 65535
/etc/sysctl.conf 内核参数配置文件
#解决TIME_WAIT数量过多问题
net.ipv4.tcp_tw_reuse=1 开启TIME_WAIT连接重用于新的TCP连接
net.ipv4.tcp_tw_recycle=1 开启TIME_WAIT连接快速回收,已废弃,高版本的内核此参数可能会导致连接问题
net.ipv4.tcp_max_tw_buckets=5000 设置系统可以处理的TIME WAIT连接的最大数量,默认值为16384
net.ipv4.tcp_fin_timeout=30 设置系统TCP连接关闭的超时时间(MSL),默认值为60,减少等待关闭连接的时间,尽快释放系统资源
#进一步优化本地的可用端口范围,提升服务器的并发能力,还能适当预防syn flood攻击
net.ipv4.ip_local_port_range=1024 65535 设置系统用于向外连接的本地端口范围,默认情况下范围很小,为32768 60999
net.ipv4.tcp_keepalive_time=1200 设置发送keepalive探测包确认客户端是否断网的间隔时间,默认值为7200秒
net.ipv4.tcp_max_syn_backlog=32768 设置系统能接受的tcp半连接状态的最大队列长度,TCP三次握手建立阶段接受SYN请求队列的最大长度,默认值为128
net.core.netdev_max_backlog=16384 设置网络接口接收数据包的最大队列长度,默认值为1000
net.core.somaxconn=16384 设置系统中每个端口允许的最大监听队列长度,默认值为128,需要配合Nginx的配置才能生效 listen 80 backlog=16384;
net.ipv4.tcp_syncookies=1 开启SYN Cookies功能,可以适当预防syn flood攻击
net.ipv4.tcp_synack_retries=2 设置发起syn+ack的最大重试次数,默认为5,可以适当预防syn flood攻击
net.ipv4.ip_forward=1 开启IP数据包转发功能
nginx模块
http_stub_status_module 访问状态统计模块
http_rewrite_module URL地址重写模块
http_gzip_module 网页压缩模块
http_ssl_module https安全加密模块
http_access_module 访问控制模块
http_cache_module web网页缓存模块
http_proxy_module 代理转发模块
http_upstream_module 负载均衡模块
http_limit_conn_module 限制连接数模块
http_limit_req_module 限制请求速率模块
代理
服务端和客户端之间架设的一层服务器。代理负责接收客户端的请求并将它转发给服务端,然后再将服务端返回的响应转发给客户端。
正向代理:为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
反向代理:为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
nginx负载均衡:通过反向代理实现的,可以将nginx反向代理服务器接收到的请求根据调度策略转发给多个后端应用服务器处理。
nginx动静分离:通过location匹配用户的访问路径来判断是静态资源请求还是动态资源请求。静态资源请求就由nginx自行处理并响应,动态资源请求则通过反向代理转发请求给后端应用服务器处理。
反向代理类型
七层反向代理
基于http https等七层应用协议的代理转发,可以根据用户请求访问的URL路径来转发请求,通常用于做 动静分离 等应用场景
配置
http {
1)在 http 配置块中使用 upstream 定义后端应用服务器池的名称和各个节点的参数
upstream 服务器池名称 {
server IP1:PORT1 weight=1;
server IP2:PORT2 weight=1;
[调度策略;]
}
2)在 server 配置块中使用 location 匹配用户请求的动态资源的URL路径,在 location 配置块里使用 proxy_pass 基于协议配置转发
server {
listen
server_name
.....
location ~ .*\.jsp$ {
proxy_pass http://服务器池名称;
#还可以添加一些转发参数,用于为后端服务器获取真实的客户端地址
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
四层反向代理
基于IP 端口实现的代理转发,可以根据用户请求的IP或端口来转发请求,通常用于做 网络接入层的负载均衡器 等应用场景
1)编译安装nginx时需要添加 stream 四层代理模块 ./configure --with-stream
2)在 http 配置块上面同层级添加 stream 配置块,在 stream 配置块里添加 upstream 配置块,使用 upstream 定义后端应用服务器池的名称和各个节点的参数
stream {
upstream 服务器池名称 {
server IP1:PORT1 weight=1;
server IP2:PORT2 weight=1;
[调度策略;]
}
3)在 stream 配置块里添加 server 配置块,在 server 配置块里使用 listen 定义监听地址和端口,使用 proxy_pass 配置转发
server {
listen IP:PORT;
proxy_pass 服务器池名称;
}
}
http {....}
四层反向代理 比 七层反向代理 转发性能更高;
七层反向代理 比 四层反向代理 转发功能更多、更灵活
负载均衡调度策略
(调度算法、调度模式、负载均衡模式)
轮询 是nginx默认调度策略,按照时间顺序逐一分配请求
加权轮询 使用weight参数设置权重,权重值越高的后端节点被分配请求的概率越大
least_conn(最少连接) 优先将请求分配给当前连接数最少的后端节点
ip_hash 根据客户端IP做hash缓存调度,会将来自同一个IP的请求都分配给固定的一个后端节点
url_hash 根据客户端请求的URL路径做hash缓存调度,会将相同的URL路径的请求都分配给固定的一个后端节点。需要第三方插件模块支持
fair 优先将请求给给响应时间最少的后端节点。需要第三方插件模块支持
random 随机分配请求
hash $remote_addr consistent 一致性hash算法,根据nginx全局变量的值来做hash缓存调度
配置
upstream 服务器池名称 {
server IP1:PORT1 weight=权重 max_fails=最大的失败次数 fail_timeout=暂时服务的时间;
.....
least_conn;/ip_hash;/fair;/hash $request_uri;/random;
}
nginx做负载均衡如何实现会话保持?
1)ip_hash url_hash hash $remote_addr consistent 基于客户端IP或请求的URL路径将请求发送到同一个后端节点服务器来实现会话保持,但是此法容易出现负载失衡问题
2)sticky_cookie_insert 基于cookie判断实现会话保持
upstream backend {
server IP1:PORT1;
server IP2:PORT2;
sticky; #可选参数:domain=www.xy103.com(设置cookie作用的域名) expires=1h(设置cookie的生存期,默认不设置,浏览器关闭即失效) path=/(设置cookie作用的URL路径,默认根目录)
}
3)通过后端应用服务器自身机制,配合使用缓存数据库(redis、memcached等)为后端节点服务器做session同步复制实现会话保持
限流
Nginx限流就是限制用户请求速度,防止服务器受不了
限流有3种
- 正常限制访问频率(正常流量)
- 突发限制访问频率(突发流量)
- 限制并发连接数
Nginx的限流都是基于漏桶流算法
实现三种限流算法
- 正常限制访问频率(正常流量) 限制一个用户发送的请求,我Nginx多久接收一个请求。 Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。- 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;- 绑定限流维度
server{ location/seckill.html{ limit_req zone=zone; proxy_pass http://lj_seckill; }}
1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。 - 突发限制访问频率(突发流量): 限制一个用户发送的请求,我Nginx多久接收一个。 上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢? Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:- 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;- 绑定限流维度
server{ location/seckill.html{ limit_req zone=zone burst=5 nodelay; proxy_pass http://lj_seckill; }}
为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求 - 限制并发连接数 Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:
http { limit_conn_zone $binary_remote_addr zone=myip:10m; limit_conn_zone $server_name zone=myServerName:10m;}server { location / { limit_conn myip 10; limit_conn myServerName 100; rewrite / http://www.lijie.net permanent; }}
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接
版权归原作者 abandondyy 所有, 如有侵权,请联系我们删除。