先确定安装了nginx, 通过nginx -v
查看版本
一、目标
要实现的效果是:一个服务器下有两个网站(个人博客和博客后台管理系统)和一个nodejs服务(就是后台——提供接口服务),
二、知识点
2.1 反向代理
反向代理:普通的代理设备是内网用户通过代理设备出外网进行访问(如:vpn),而工作在这种模式下的负载均衡设备,则是外网用户通过代理设备访问内网(用户通过浏览器上网),因此称之为反向代理。
三、思路
3.1 网站的访问
两个网站其实都是静态资源,它们是存放在服务器上,然后通过相应的地址可以访问到
主要的问题在于: 我们通过地址怎么可以访问到服务器上的文件夹。
两种实现思路:
- 使用nginx作为反向代理服务器来处理从浏览器接收到的请求(nginx处理静态资源)
- 使用nodejs来响应从浏览器接收到的请求(nodejs处理静态资源)
nginx简单点理解:它是一个web服务器,凡是通过域名或ip地址访问服务器,先要经过nginx进行处理,然后由它来转发请求到各个不同的端口或其他服务器上。基于这个特性,它可以作为反向代理、负载均衡器以及Http缓存(这里没有涉及缓存),nginx是完全由配置文件控制,也就是可以直接通过配置文件来操作它
3.1.1 思路一:nginx作为反向代理服务器处理静态资源
分为两步:
- 准备好对应的资源
- 配置nginx
第一步:准备好资源
在服务器的/www/blog/
目录下创建index.html
文件,里面就是普通的html内容
第二步:配置nginx
打开/etc/nginx/conf.d/
文件夹,创建配置文件smallmage.conf
,内容如下:
server {
listen 80; // 表示http协议的端口
server_name smallmage.com; // 域名地址
location / { // 定位
root /www/blog; // 根目录
index index.php index.html index.htm; // index定义的是首页
}
}
上面的配置文件意思是:当访问http://smallmage.com
这个域名地址时(http协议的默认端口是80),就到服务器的/www/blog
路径下去取文件,默认首页是:index.php、index.html、index.htm
,假如/www/blog
文件夹下有index.php
和index.html
文件,则优先返回index.php
文件,也就是有优先级的。如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。
nginx怎么找到/etc/nginx/conf.d/smallmage.conf
这个文件呢?
该文件是在/etc/nginx/nginx.conf
中会被引入,如果不确定nginx的配置文件路径,可以通过sudo nginx -t
来查看nginx的状态,从里面可以获取到nginx的配置文件路径,如下所示:
从
nginx.conf
里面可以查找到引入的所有配置nginx的配置文件信息,如下:nginx.conf配置文件
注意:
- 要想通过
smallmage.com
来访问服务器,需要将smallmage.com
这个域名解析到我们的服务器ip地址上,才可以通过smallmage.com
来访问 - 更改了nginx相关的配置后,需要重启nginx,nginx命令如下:
sudo nginx -t
: 查看nginx状态
sudo nginx -s reload
:重启服务器
上面便设置了nginx作为反向代理服务器处理静态资源
3.1.2 思路二:使用nodejs来处理静态资源
其实就是在服务器上启动一个nodejs服务,然后通过ip地址+端口
来访问资源,由node来响应请求,不需要配置nginx;
分为两步:
- 编写使用nodejs接口的js文件
- 使用node来启动该文件
第一步:编写使用nodejs接口的js文件
在/www/test/
目录下创建test.js
文件,内容如下;
const http = require('http')
http.createServer(function(req,res) {
res.writeHead(200,{'Content-Type':'text/plain'})
res.end('hello world')
}).listen(8082) // 监听8082端口
console.log('server test')
第二步:使用node来启动该文件
使用node test.js
来执行该文件,当然也可以使用pm2
假设该服务器的ip为: 123.45.67.9
,那么就可以通过123.45.67.9:8082
来访问,可以在浏览器上看到hello world
3.2 nodejs服务(提供接口服务)
接口服务:就是指前端调用后端的api接口
常说的前端和后端,这里的nodejs服务(接口服务)其实就是后端,也就是说我们的后端使用的是nodejs来实现的。
其实就是将上两个例子结合起来,也就是:在服务器启动一个nodejs服务,然后使用nginx来作为反向代理以及负载均衡处理;
一般如果使用nodejs作为后端,会选择一个框架进行开发,常用框架有:express、Koa
主要分为两大步来实现该nodejs服务:
- 编写后端(nodejs)代码
- 配置nginx
- 使用nginx作为反向代理
- 使用nginx处理负载均衡
3.2.1 编写后端代码
跟上面的使用nodejs来处理静态资源是一样的, 只不过是更复杂一些,需要对各个接口进行处理,假如是一个商品接口,就需要有:goods/get、goods/add、goods/delete、goods/update
等接口,这是代码层面的;
因为我们的网站肯定是在服务器开机的时候一直运行的,否则我们的网站将无法访问,因此需要使用一些部署工具来处理nodejs服务,例如在node服务挂掉的时候可以重启、在服务器重启后,node服务也需要自动重启,常用的部署工具有:pm2
3.2.2 配置nginx
前端访问接口时,肯定不会使用ip地址来访问,因此使用nginx来做反向代理。
nginx配置如下:
upstream server {
server 127.0.0.1:8083;
}
server {
listen 80;
server_name www.smallmage.com;
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
# value for proxy_pass has to match upstream name
proxy_pass http://server;
proxy_redirect off;
}
}
上面配置的意思就是:当访问www.smallmage.com/api
时就将请求丢给proxy_pass
设置的服务,也就是127.0.0.1:8083
,假如我们的node服务就监听着8083
端口,那么node服务就会接收到该请求,然后再对该请求进行处理,最后返回相应的数据
网友评论