初识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:80http://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的理解,如果有什么错误,欢迎大家指正。