Nginx 简介
Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
在我们前端日常开发中,只需要把前端项目打成一个静态资源包,然后往nginx中一丢,启动下Nginx就可以稳定访问我们的前端资源了,而且性能高且稳定。
在我们实际开发应用中,需要了解Nginx的以下几个功能
- 正向代理
- 反向代理
- 负载均衡
- 动静分离
安装Nginx
在这里我们在阿里云的服务器中使用docker镜像来运行nginx的服务
拉取镜像
docker pull nginx
在这里拉去的默认是最新版本,也可以在nginx后面加版本号拉取指定版本的nginx镜像,运行完之后查看镜像已近在本地。
运行容器
docker run -d -p 80:80 --name hexo-blog -v /root/workspace/hexo-blog:/usr/hexo-blog nginx
上面命令解释下:
-d: 以守护进程运行
-p 80:80: 宿主机80端口映射和容器的80端口
–name: 给这个容器取名为 hexo-blog
-v: 并设置容器卷将容器中的 usr/hexo-blog目录挂载在阿里云宿主机中的 /root/workspace/hexo-blog路径,后续我们可以直接将静态资源丢进宿主机的/root/workspace/hexo-blog这个位置,容器也就自然就有了对应的文件。
我们可以看到该容器服务已近正常运行起来了
再访问一下浏览器我们也能看到Nginx默认的页面了,
Nginx基本配置
nginx基本常用命令
nginx -t
nginx -t
上面命令两个作用
- 显示当前的Nginx配置文件路径
- 测试当前的Nginx配置是否有问题,如果有问题的话会报出那一行配错的
我们进入该容器然后运行上述命令就可查看到如下界面
nginx -s reload
nginx -s reload
也是一个很重要的命令,我们一般都会对默认的nginx配置做出一些修改,等配置文件修改完之后我们需要重启一下nginx的服务,让新配置生效。就可以运行这条命令
nginx -s stop
关闭nginx服务
容器中安装vim
这里简单提一下这个,因为要修改nginx的默认配置,所以需要在虚拟机中编辑文件,而现在容器中基本都只有最基本的依赖,所以vim这个需要我们自己单独在容器中安装一下
进入nginx容器
docker exec -it containerId /bin/bash
安装vim包
# 这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包
apt-get update
# 安装vim
apt-get install vim
nginx常用配置
nginx的配置文件大体可以看成三部分:
- 全局快
- event块
- http块
- http全局快
- server块
先来一张整体的图
全局块
从配置文件开始到 events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程pid存放路径、日志存放路径和类型以及配置文件的引入。
在上图中标注为红色矩形部分
#处理并发数的配置
worker_process 1;
表nginx服务器并发处理服务器的关键配置,值越大,可以支持的并发处理数就越多,但会受到硬件,软件设备的制约
event块
影响 Nginx 服务器与用户的网络连接。比如:
worker_connections 1024;
表nginx支持最大的连接数。在上图中蓝色部分
http块
nginx配置中最频繁的部分,代理,缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
http块也可以包括http全局快, server块
http全局块
http全局块配置的指定包括文件引入,MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等。
# 配置了nginx所支持的文件类型,在 /etc/nginx/mime.types;中罗列了所支持的类型,如果想去除某种文件类型,可以直接在mim2.types中去除掉
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# nginx的日志存储路径
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# 该nginx最终配置文件会把/etc/nginx/conf.d/*.conf中所有的配置集合在一起,最终合成一个大的配置文件
include /etc/nginx/conf.d/*.conf;
/etc/nginx/mime.types 文件中展示了nginx所支持的文件类型
server
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也分全局server块,以及可以同时包含多个location块。
全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
location块
一个server块可以配置多个location块。
这块的主要作用是基于nginx服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
server {
# 表示监听的端口号是80
listen 80;
# 该虚拟机的域名(也可以是ip)
server_name www.yjian.site;
# 访问 www.yjian.site:80(www.yjian.site) 这个地址的时候会返回 /usr/hexo-blog/public/index.html 文件给客户端
root /usr/hexo-blog/public;
# 表在 www.yjian.site 域名中访问中以 js|css|png|gif|jpg|mp3|ogg 这些文件会被转发到 www.yjian.site/usr/hexo-blog/public中去找
location / {
root /usr/hexo-blog;
}
}
nginx部署静态资源demo
将前端工程打成静态资源
一般vue或者react工程的脚手架都会把前端工程打成一个静态资源包。
静态资源包丢入nginx中
这一步有很多方法,常规一点的就是先用git 上传到gitlab/github中。然后再去容器中git clone下。不拘泥于方法,只要达到这个目的就好
这里就直接简单粗暴,使用linux中的scp把本地的静态资源包复制到阿里云服务器上,由于之前我们在阿里云服务器运行nginx容器服务的时候挂在了数据卷。所以这些静态资源文件也会同步到Nginx容器中的指定位置
scp -r /Users/yjian/Documents/yjian/myGit/hexo-blog/public root@121.40.171.78:/root/workspace/hexo-blog
然后输入服务器的密码。等命令执行完之后再容器中的 /usr/hexo-blog 路径下也会有静态资源包
修改nginx配置并重启
主要就是修改一下server部分
server {
# 表示监听的端口号是80
listen 80;
# 该虚拟机的域名(也可以是ip)
server_name www.yjian.site;
# 访问 www.yjian.site:80(www.yjian.site) 这个地址的时候会返回 /usr/hexo-blog/public/index.html 文件给客户端
root /usr/hexo-blog/public;
}
然后 重启一下Nginx的服务。访问www.yjian.site之后发现会报如下错误:
这个原因就是上述配置相当于只配置了访问 www.yjian.site:80(www.yjian.site)的时候会转发到 root /usr/hexo-blog/public 这个目录中,返回index.html。
但访问其他的静态资源的时候却没有配置转发路径。所以增加location块,如下:
server {
# 表示监听的端口号是80
listen 80;
# 该虚拟机的域名(也可以是ip)
server_name www.yjian.site;
# 访问 www.yjian.site:80(www.yjian.site) 这个地址的时候会返回 /usr/hexo-blog/public/index.html 文件给客户端
root /usr/hexo-blog/public;
# 表在 www.yjian.site 整个域名中访问的其他请求, 会被转发到 www.yjian.site/usr/hexo-blog/public中去找
location / {
root /usr/hexo-blog;
}
}
一般我们的静态资源如果放在单独的地方也可以再追加配置一个location
location ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
root /usr/static/file;
}
举个例子:在访问 www.yjian.site/public/css/index.css的时候。会命中 location / 这个正则匹配
就会把这个请求的域名转发到 /usr/hexo-blog中。也就是 www.yjian.site中的index.css会去 /usr/hexo-blog中去找 public/css/index.css
所以寻找的逻辑是,通过访问的 www.yjian.site域名的80端口找到了这台公网中的服务器,然后取这台服务器中的 /usr/hexo-blog 路径下去寻找public/css/index.css
这样整个服务就正常了