nginx是一个开源且高性能、可靠的HTTP中间件和代理服务器。
由于公司业务场景经常需要配置nginx,上个周末将所有的坑踩了一遍,深有感触。随着前端技术的发展,业务触角的不只是安于浏览器领域。正所谓,跳出三界外,活在五行中。只有站的更高,才能走的更远。与君共勉。
nginx的优点
1、IO多路复用,多个描述符的IO操作都能在一个线程里并发交替顺序完成
发展历史
-
- 最早以Apache为代表的多线程跳转头模式,缺点:当启动过多是浪费性能,并且切换时间不叫慢
- select线性遍历文件描述列表,不停轮询,缺点:1、效率低下 2、最多只能有1024
- epoll每当fd就绪,采用系统回调函数将fd放入。优点:1、效率高 2、没有1024限制
2、CPU亲和 一种把CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个CPU上执行,减少切换CPU和提交缓存命中率,获得更好的性能。
3、sendfile零拷贝传输模式
绕过用户空间模式,直接从内核空间中读取数据,缩减流程
nginx的安装
环境:阿里云centOS系统
安装方式:
- 方式一(较为繁琐):下载nginx的压缩包,拷贝至云端,tar解压,make 安装
- 方式二(较为方便,方便管理卸载):调用linux内置的包管理器
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 yum install nginx -y nginx -v nginx -V复制代码
warning: 安装完成之后,发现nginx起来之后,调用ip始终是挂掉的。悲伤到怀疑人生的我检查了诸多端口,nginx起来啦!端口就是Nginx本尊啊!为甚么没有起来!老子信了你的邪~~~最后最后最后,发现了Linux的小坑,就是防火墙!!!啊啊啊,防火防盗防火墙!!!此处默念几行命令,防火墙退去:
功能 | 命令 |
---|---|
停止防火墙 | systemctl stop firewalld.service |
永久关闭防火墙 | systemctl disable firewalld.service |
既然防火墙都关了,嘿嘿嘿,那也不妨多做点工作吧
- 停用selinux(最大限度地减小系统中服务进程可访问的资源(最小权限原则)): /etc/selinux/config SELINUX=enforcing改为SELINUX=disabled ,(PS:Linux这个傻屌,权限的等级制度,对小白来说简直是魔鬼啊有木有)
- 安装依赖
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim复制代码
配置文件
主要的配置文件是以下两个
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/*
代理
说到代理(不正经的我内心os:第三方赚差价?)貌似nginx还是挺厚道,正向代理和反向代理都可以胜任。那么问题来啦,这是啥?其实两者大家平时都接触的比较多,我这边的理解是正向代理作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址;而反向代理是作为服务器端(如Web服务器)的代理使用,而不是客户端。客户端借由前向代理可以间接访问很多不同互联网服务器(集群)的资源,而反向代理是供很多客户端都通过它间接访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。
上图为正向代理,在这个场景中客户端和代理服务器同属一个lan(局域网),两者相互透明,而server端只能看到proxy服务的信息。譬如我们经常用的翻墙就是这个原理
反向代理
平时我们浏览的大型网站就会用到反向代理,也就是代理服务器和应用服务器同为一个lan(局域网),而用客户端请求时并不知道真实的服务器。
而我们的nginx用处最多就是反向代理,此处引出另一个概念----负载均衡
每个服务器的内存和处理能力都是有限制的,如果面对巨量的访问和请求时,如何解决这个问题呢?这边是通过集群服务,将请求通过算法规则分发到每一个独立的服务器,说白了,就是类似机海战术啦,团结就是力量~~~~
前端实用技巧小摘
缓存:设置请求头缓存过期时间
location ~ .*\.(jpg|png|gif)$ {
expires 24h;
}复制代码
跨域配置:
location ~ .*\.json$ {
add_header Access-Control-Allow-Origin http://localhost:3000;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /data/json;
}复制代码
防盗链
防止网站资源被盗用
location ~ .*\.(jpg|png|gif)$ {
valid_referers none blocked 47.104.184.134;
if ($invalid_referer) {
return 403;
}
}
复制代码
反向代理
location ~ ^/api {
proxy_pass http://127.0.0.1:3000;
}复制代码
负载均衡
upstream test {
server localhost:7777;
server localhost:8080;
}
server {
location / {
proxy_pass http://test;
}复制代码
nginx代理缓存
http{
proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
} 复制代码
- proxy_cache_path 缓存文件路径
- levels 设置缓存文件目录层次;levels=1:2 表示两级目录
- keys_zone 设置缓存名字和共享内存大小
- inactive 在指定时间内没人访问则被删除
- max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
location /tmp-test/ {
proxy_cache tmp-test;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}复制代码
- proxy_cache tmp-test 使用名为tmp-test的对应缓存配置
- proxy_cache_valid 200 206 304 301 302 10d; 对httpcode为200…的缓存10天
- proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
- proxy_set_header 自定义http header头,用于发送给后端真实服务器。
- proxy_pass 指代理后转发的路径,注意是否需要最后的/