Nginx工具
Web网络服务
我们平时访问的网站服务就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。
web网络服务是被动的网络服务,通过网络传输资源,流程如下:
用户发起网络请求 --> 网络服务器接受到请求 --> 网络服务器取资源 --> 将资源通过http(超文本传输协议)和https(安全超文件传输协议)返回。
web服务器与web框架的关系
- web服务器:接受http/https请求,返回数据。
- web框架:开发web应用程序,处理得到的数据。
nginx是什么
优点:
- 开源
- 高性能,高并发
- 资源消耗少
- 可以做http反向代理
- 负载均衡
- 支持异步网络i/o事件模型epoll
- Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
nginx下载安装
- 可以直接npm安装,这里介绍源码包安装
-
源码包下载
摘一句话:淘宝网是开源软件的用户和受益者,我们也想成为开源软件的贡献者。这就是我们决定开源Tengine的原因。
-
安装依赖:
# 其中有一些重要的库:gcc、pcre(正则表达式库)、zlib、OpenSSL yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y # ubuntu apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make
-
释放Makefile
./configure --prefix=/opt/tengine12/
-
编译安装
make && make install
-
设置环境变量,并记一些常用命令
nginx #启动
nginx -s stop #关闭
nginx -s reload #重新加载
nginx目录结构
[root@iZ2vchdoid8iit383hsodtZ tengine12]# ls
client_body_temp conf fastcgi_temp html include logs modules proxy_temp sbin scgi_temp uwsgi_temp
- conf 存放nginx配置文件
- html 存放前端文件目录
- logs 存放nginx运行日志,错误日志
- sbin nginx执行脚本
nginx主要配置
参考文章:nginx配置
配置的位置处于conf当中的nginx.conf
# 核心配置模块
user nginx; # nginx进程所用的用户
worker_processes 1; # nginx占几个进程
error_log /var/log/nginx/error.log; # 错误日志在哪
pid /run/nginx.pid; # 进程生成的pid放哪
events # 事件模块
http # 内核模块
event模块:
#事件模型:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
worker_connections 65535;
http模块:
#文件扩展名与文件类型映射表,基本上不变
include mime.types;
# include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
#日志格式设定
#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
#$remote_user:用来记录客户端用户名称;
#$time_local: 用来记录访问时间与时区;
#$request: 用来记录请求的url与http协议;
#$status: 用来记录请求状态;成功是200,
#$body_bytes_sent :记录发送给客户端文件主体内容大小;
#$http_referer:用来记录从那个页面链接访问过来的;
#$http_user_agent:记录客户浏览器的相关信息;
#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#负载均衡配置
upstream jh.w3cschool.cn {
......
}
# 虚拟主机,也就是服务配置(可以多个)
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开,ip或者localhost(本机地址)
server_name www.w3cschool.cn w3cschool.cn;
index index.html index.htm index.php;
#对 "/" 启用反向代理
location / {
root html; # 定义root根目录
index index.html index.htm; # 主页
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
# 错误页面,当页面返回404时返回404.html(/指的网页根目录)
error_page 404 /404.html;
}
nginx限制访问功能
在nginx.conf当中,编辑server当中添加
deny ip; # 把某ip禁用访问,写在location底下
nginx状态信息
状态信息功能,监测当前有多少连接数。
使用如下(在server当中添加一个location):
location /status {
stub_status on;
- 压测命令ab
yum install httpd-tools
# 1000个并发,100000次请求
ab -kc 1000 -n 100000 http://192.168.119.10/
基于域名和更改server_name实现基于域名的虚拟主机
添加http模块当中server参数:
- 例如我有两个域名:www.htsp.com、www.djsidsjd.com
可以这样修改配置文件
server {
listen 80;
server_name www.htsp.com;
location /{
root html/gtsp;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.djsidsjd.com;
location /{
root html/djsidsjd;
index index.html index.htm;
}
}
这样的话,重启以后,通过域名的不同,我可以访问不同的页面。同样暴露在80端口。
路径url的正则匹配
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
举个栗子:
server {
listen 80;
server_name pythonav.cn;
#优先级1,精确匹配,根路径
location =/ {
return 400;
}
#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}
#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}
#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#优先7,通用匹配
location / {
return 403;
}
}
负载均衡
什么是集群
指一组或者若干个相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统。(一堆服务器共同做一件事)
简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理。当用户客户机清求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。
打开谷歌、百度的页面,看起来好简单,也许你觉得用几分钟就可以制作出相似的网页,而实际上,这个页面的背后是由成千上万台服务器集群协同工作的结果。而这么多的服务器维护和管理,以及相互协调工作也许就是读者你未来的工作职责了。
若要用一句话描述集群,即一堆服务器合作做同一件事,这些机器可能需要整个技术团队架构、设计和统一协调管理,这些机器可以分布在一个机房,也可以分布在全国全球各个地区的多个机房。
优点
-
高性能
一些需要大量计算的业务,即便是一台算力很强的计算机,计算能力也是有限的。但是,集中几十台甚至万-十万台的服务器,可以极大的提高性能。
-
价格有效性
通过几台性能较低的服务器集群,可以媲美较高配置的服务器,具有更高的性价比。
-
可伸缩性
当系统性能不足时,对集群中的较低性能机器进行升配,比提高一个高性能服务器的性能,相对来说更加简单,花销也较少
-
高可用性
单一计算机可能会面临设备损坏的情况,一旦损坏,业务全挂。而计算机集群,其中一台计算机的失效,不会使得所有业务都挂了。几乎可以实现7*24的服务。
-
透明性(安全性)
对于服务器集群,用户访问集群系统时,就像访问一台高性能服务器一样,不会暴露所有服务器的情况。同时,部分服务器的上下线,也不会中断整个系统服务。
负载均衡
可以通过下文详细了解:https://www.cnblogs.com/funcquery/p/16009094.html
-
工作情况:通过集群,将web服务器分为多个,从而减少单个服务器的负担
-
工作原理
用户对负载均衡器发送请求(大流量,多用户),通过均衡器(根据算法将流量分发)。以轮询(一个一个发)或者加入权重的方式分发请求,让多个服务共同工作,减少单台服务器的负荷,提高响应效率。
-
负载均衡和代理
从图中看,代理与负载均衡几乎是一样的。最大的区别是:- 代理将请求转发给了一台服务器。
- 负载均衡是通过算法,将请求转发到了多台一模一样的服务器,从而实现单台设备负载的减少。(upstream虚拟代理池)
实现负载均衡、动静分离的效果
-
将代码/服务跑在不同的机器,或者是跑在不同的端口。(相同的服务)
- 负载均衡(被分配的服务器跑相同的服务。)
- 动静分离(分为跑动态页面和跑静态页面的服务器组。)
-
对于不同的服务器组(提供相同服务的服务器)
配置:
# 动态页面服务器 upstream django { server 10.0.0.10:8000; # 也可以是自己服务器的不同端口 # server 127.0.0.1:2481; server 10.0.0.11:9000; } # 静态页面服务器 upstream static { server 192.168.119.11:80; }
- 默认的情况下,对服务器组的分发是轮询规则。
所有的规则如下:调度算法 概述 轮询 按时间顺序逐一分配到不同的后端服务器(默认) weight 加权轮询,weight值越大,分配到的访问几率越高 ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器 url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 least_conn 最少链接数,那个机器链接数少就分发
例子:
# 轮询 upstream django { server 10.0.0.10:8000; server 10.0.0.11:9000; } # 权重 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000 weight=10;#这个节点访问比率是大于8000的 } # ip_hash # 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器 upstream django { ip_hash; server 10.0.0.10:8000; server 10.0.0.11:9000; } # backup # 在非backup机器繁忙或者宕机时,请求backup机器,因此机器默认压力最小 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000; server node.oldboy.com:8080 backup; }
- 在虚拟主机当中设置规则
这里以动静分离为例子
server { listen 80; server_name 192.168.119.12; # 当请求到达192.168.119.12:80/时,转发给flask的8080应用 location / { proxy_pass http://django; include proxy_params; } # 当判断资源请求是 192.168.119.12/girl.jpg时候,转发请求给static地址池 # 的服务器192.168.119.11/ location ~ .*\.(png|jpg|gif)$ { proxy_pass http://static; include proxy_params; } }
- 这样就完成了负载均衡的配置。
- 默认的情况下,对服务器组的分发是轮询规则。