本文已收录在前端食堂同名仓库
Github
github.com/Geekhyt,欢迎光临食堂,如果觉得酒菜还算可口,赏个 Star 对食堂老板来说是莫大的鼓励。
互联网的全球化导致了互联网的数据量快速增长,加上在本世纪初摩尔定律在单核 CPU 上的失效,CPU 朝着多核方向发展,而 Apache 显然并没有做好多核架构的准备,它的一个进程同一时间只能处理一个连接,处理完一个请求后才能处理下一个,这无疑不能应对如今互联网上海量的用户。况且进程间切换的成本是非常高的。在这种背景下,Nginx 应运而生,可以轻松处理数百万、上千万的连接。
通过 rpm -ql nginx
可以查看 Nginx 安装的配置文件和目录。
如图是我在某某云上安装的最新稳定版本的Nginx的配置文件及目录。
关于 Nginx 的常用命令以及配置文件语法很容易就可以搜到,本文不作赘述,下面从 Nginx 的功能以及实际场景出发看一看各个场景下 Nginx 可以提供给我们哪些配置项。在此之前,我们先来明确两个概念:
一句话解释正向代理,正向代理的对象是客户端,服务器端看不到真正的客户端。
resolver 8.8.8.8 # 谷歌的域名解析地址
server {
location / {
# 当客户端请求我的时候,我会把请求转发给它
# $http_host 要访问的主机名 $request_uri 请求路径
proxy_pass http://$http_host$request_uri;
}
}
一句话解释反向代理,反向代理的对象是服务端,客户端看不到真正的服务端。
跨域是前端工程师都会面临的场景,跨域的解决方案有很多。不过要知道在生产中,要么使用 CORS 、要么使用 Nginx 反向代理来解决跨域。在 Nginx 的配置文件中进行如下配置即可:
server {
listen 80;
server_name localhost; # 用户访问 localhost,反向代理到 http://webcanteen.com
location / {
proxy_pass http://webcanteen.com
}
}
Gzip 是互联网上非常普遍的一种数据压缩格式,对于纯文本来说可以压缩到原大小的 40%,可以节省大量的带宽。不过需要注意的是,启用 Gzip 所需的 HTTP 最低版本是 1.1。
location ~ .*\. (jpg|png|gif)$ {
gzip off; #关闭压缩
root /data/www/images;
}
location ~ .*\. (html|js|css)$ {
gzip on; #启用压缩
gzip_min_length 1k; # 超过1K的文件才压缩
gzip_http_version 1.1; # 启用gzip压缩所需的HTTP最低版本
gzip_comp_level 9; # 压缩级别,压缩比率越高,文件被压缩的体积越小
gzip_types text/css application/javascript; # 进行压缩的文件类型
root /data/www/html;
}
对于大流量恶意的访问,会造成带宽的浪费,给服务器增加压力。往往对于同一 IP 的连接数以及并发数进行限制。
关于请求限制主要有两种类型:
# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小
limit_conn_zone $binary_remote_addr zone=coon_zone:10m;
server {
# conn_zone 设置对应的共享内存区域 1是限制的数量
limit_conn conn_zone 1;
}
# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小 rate 为请求频率 1s 一次
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
location / {
# 设置对应的共享内存区域 burst最大请求数阈值 nodelay不希望超过的请求被延迟
limit_req zone=req_zone burst=5 nodelay;
}
}
关于访问控制主要有两种类型:
(基于用户的信任登陆不是很安全,本文不做配置介绍)
以下是基于 IP 的访问控制:
server {
location ~ ^/index.html {
# 匹配 index.html 页面 除了 127.0.0.1 以外都可以访问
deny 127.0.0.1;
allow all;
}
}
ab命令全称为:Apache bench,是 Apache 自带的压力测试工具,也可以测试 Nginx、IIS 等其他 Web 服务器。
ab -n 1000 -c 5000 http://127.0.0.1/
防盗链的原理就是根据请求头中 referer 得到网页来源,从而实现访问控制。这样可以防止网站资源被非法盗用,从而保证信息安全,减少带宽损耗,减轻服务器压力。
location ~ .*\.(jpg|png|gif)$ { # 匹配防盗链资源的文件类型
# 通过 valid_referers 定义合法的地址白名单 $invalid_referer 不合法的返回403
valid_referers none blocked 127.0.0.1;
if ($invalid_referer) {
return 403;
}
}
当我们的网站需要解决高并发、海量数据问题时,就需要使用负载均衡来调度服务器。将请求合理的分发到应用服务器集群中的一台台服务器上。
Nginx 可以为我们提供负载均衡的能力,具体配置如下:
# upstream 指定后端服务器地址
# weight 设置权重
# server 中会将 http://webcanteen 的请求转发到 upstream 池中
upstream webcanteen {
server 127.0.0.1:66 weight=10;
server 127.0.0.1:77 weight=1;
server 127.0.0.1:88 weight=1;
}
server {
location / {
proxy_pass http://webcanteen
}
}
后端服务器支持以下的状态配置:
upstream webcanteen {
server 127.0.0.1:66 down;
server 127.0.0.1:77 backup;
server 127.0.0.1:88 max_fails=3 fail_timeout=10s;
server 127.0.0.1:99 max_conns=1000;
}
公众号:前端食堂
掘金:童欧巴
知乎:童欧巴
这是一个终身学习的男人,他在坚持自己热爱的事情,欢迎加入前端食堂,和这个男人一起开心的变胖~