初识Nginx 作为一个前端,如果说不会nginx的话,大概都不敢和别人说自己是搞前端的(前端应用的部署、通过反向代理解决跨域问题等等),下面是nginx的官方介绍
“Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。”
Nginx的优点
支持海量高并发
内存消耗少
免费且可以用于商业
配置文件简单
安装Nginx 安装依赖 yum install gcc
yum install pcre-devel
yum install zlib zlib-devel
yum install openssl openssl-devel
或者同时安装
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
下载nginx安装包 1 2 3 4 5 6 7 //创建一个文件夹 cd /usr/local mkdir nginx cd nginx //下载tar包 wget http://nginx.org/download/nginx-1.13.7.tar.gz tar -xvf nginx-1.13.7.tar.gz
安装nginx 1 2 3 4 5 6 7 8 9 10 11 //进入nginx目录 cd /usr/local/nginx/ cd nginx-1.13.7 //执行命令 ./configure //执行make命令 make //执行make install命令 make install //测试是否成功 /usr/local/nginx/sbin/nginx -t
增加ssl模块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //进入nginx目录 cd /usr/local/nginx/nginx-1.13.7 //查看nginx版本机器参数 /usr/local/nginx/sbin/nginx -V //重新编译 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module //make编译 make //备份原来的nginx cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak // 拷贝新的nginx cp objs/nginx /usr/local/nginx/sbin/nginx //测试是否成功 /usr/local/nginx/sbin/nginx -t
注意,千万不要在make install了
配置文件 nginx的配置文件在/usr/local/nginx/conf目录下,下面是nginx配置文件的详解:nginx config配置
Nginx命令 启动或重启 1 2 3 4 5 6 7 8 // 启动命令: -c 为指定配置文件目录,如果目录是默认目录/usr/local/nginx/conf/nginx.conf,可以不写 /nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf // 重启命令 systemctl restart nginx.service // 重新载入配置文件 /nginx/sbin/nginx -s reload
关闭nginx的四种方法 1 2 3 4 5 6 7 8 9 10 11 // 立即停止服务:这种方法比较强硬,无论进程是否在工作,都直接停止进程。 /nginx/sbin/nginx -s stop // 从容停止服务: 这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。 /nginx/sbin/nginx -s quit // kill杀死进程:这种方法也是比较野蛮的,我们直接杀死进程,但是在上面使用没有效果时,我们用这种方法还是比较好的。 killall nginx // systemctl 停止 systemctl stop nginx.service
访问权限
Nginx访问简单用法,deny是禁止访问,allow是允许访问。但实际项目中Nginx的访问控制还是比较复杂的,我们这节课就详细介绍一下。
指令优先级 1 2 3 4 location / { allow 192.168.20.7; deny all; }
上面的配置表示只允许192.168.20.7进行访问,其他的IP是禁止访问的。但是如果我们把deny all指令,移动到 allow 192.168.20.7之前,就会发现所有IP都不允许访问了,因此:就是在同一个块下的两个权限指令,先出现的设置会覆盖后出现的设置
复杂访问控制权限匹配 1 2 3 4 5 6 7 8 9 10 11 12 location =/img{ allow all; } location =~\.html${ allow all; } location =/admin{ deny all; } location ~\.action$ { deny all; }
=号代表精确匹配,这个关系到网站安全,一定要正确使用。 也可以用正则来做模糊匹配,比如上面场景:可以访问网站的静态资源,不允许访问admin管理平台,不允许访问.action的sevice服务
虚拟主机
我们可以直接配置在主文件里etc/nginx/nginx.conf文件里, 也可以配置在子配置文件里etc/nginx/conf.d/default.conf。
通过listen的基于端口号配置的虚拟主机 1 2 3 4 5 6 7 8 9 10 11 12 server{ listen 80; server_name localhost; root /usr/local/nginx/html/html_80; index index.html; } server{ listen 8001; server_name localhost; root /usr/local/nginx/html/html_8001; index index.html; }
上面代码,我们配置了两个端口,通过浏览器访问http://www.yangxl.cn:80
和http://www.yangxl.cn:8001
,看到的页面是不同的
通过修改server_name的基于域名或ip配置的虚拟主机 1 2 3 4 5 6 7 8 9 10 11 12 server{ listen 80; server_name nginx.yangxl.cn; root /usr/local/nginx/html/html_1; index index.html; } server{ listen 80; server_name web.yangxl.cn; root /usr/local/nginx/html/html_2; index index.html; }
上面通过访问http://nginx.yangxl.cn和http://web.yangxl.cn,看到的页面也是不同的
反向代理
反向代理是干什么用的呢?简单来说:客户端发送的请求,想要访问server服务器上的内容。发送的内容被发送到代理服务器上,这个代理服务器再把请求发送到自己设置好的内部服务器上,而用户真实想获得的内容就在这些设置好的服务器上
安全性:正向代理的客户端能够在隐藏自身信息的同时访问任意网站,这个给网络安全代理了极大的威胁。因此,我们必须把服务器保护起来,使用反向代理客户端用户只能通过外来网来访问代理服务器,并且用户并不知道自己访问的真实服务器是那一台,可以很好的提供安全保护。
功能性:反向代理的主要用途是为多个服务器提供负债均衡、缓存等功能。负载均衡就是一个网站的内容被部署在若干服务器上,可以把这些机子看成一个集群,那Nginx可以将接收到的客户端请求“均匀地”分配到这个集群中所有的服务器上,从而实现服务器压力的平均分配,也叫负载均衡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 location /proxy { if ( $request_method = OPTIONS ) { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Headers, Authorization'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; return 200; } add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Headers, Authorization'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; proxy_pass http://127.0.0.1:8080/tomcat/api; }
上面的proxy_pass即为反向代理到当前服务器的tomcat上,这么做,就可以是tomcat不暴露外网端口,增加了安全性。 注意:上面的额外的配置是用来解决前后端分离遇到的跨域问题的
自动适配PC或者移动设备
我们可以在网页中通过js代码来设定进行用户访问设备的自适应,但是,其实更好的解决办法是在nginx上配置
这样的需求有人说拿自适应就可以搞定,比如我们常说的bootstrap和24格布局法,这些确实是非常好的方案,但是无论是复杂性和易用性上面还是不如分开编写的好,比如我们常见的淘宝、京东……这些大型网站就都没有采用自适应,而是用分开制作的方式。
首先新建两个文件夹 pc 和 mobile 1 2 3 cd /usr/local/nginx/html mkdir pc mkdir mobile
修改nginx配置 1 2 3 4 5 6 7 8 9 10 11 server{ listen 80; server_name www.yangxl.cn; location / { root /usr/local/nginx/html/pc; if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') { root /usr/local/nginx/html/mobile; } index index.html; } }
nginx Gzip压缩
Gzip是网页的一种网页压缩技术,经过gzip压缩后,页面大小可以变为原来的30%甚至更小。更小的网页会让用户浏览的体验更好,速度更快。gzip网页压缩的实现需要浏览器和服务器的支持。
配置项说明
gzip : 该指令用于开启或 关闭gzip模块。
gzip_buffers : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
gzip_comp_level : gzip压缩比,压缩级别是1-9,1的压缩级别最低,9的压缩级别最高。压缩级别越高压缩率越大,压缩时间越长。
gzip_disable : 可以通过该指令对一些特定的User-Agent不使用压缩功能。
gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。
gzip_http_version:识别HTTP协议版本,其值可以是1.1.或1.0.
gzip_proxied : 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
gzip_vary : 用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。
简单配置 1 2 3 4 5 6 gzip on; # 开启gzip压缩 gzip_buffers 32 4k; # 这里表示每压缩32个包,每个包4k大小,就向客户端发送 gzip_comp_level 6; # 这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6 gzip_min_length 200; # 这里表示如果文件小于200个字节,就不用压缩,因为没有意义,本来就很小 gzip_types text/css text/xml application/javascript; # 哪些类型的文件要压缩,text/html是默认不需要写,/etc/nginx/mime.types 文件中有所有可以压缩的文件类型 gzip_vary on; # 可以不写,表示我在传送数据时,给客户端说明我使用了gzip压缩
结束语 我只是一个前端开发人员,上面只是自己通过查资料,自己整理的自己对nginx的理解,如果有什么错误,欢迎大家指正。