先確定安裝了nginx, 通過nginx -v查看版本
一、目標(biāo)
要實現(xiàn)的效果是:一個服務(wù)器下有兩個網(wǎng)站(個人博客和博客后臺管理系統(tǒng))和一個nodejs服務(wù)(就是后臺——提供接口服務(wù)),
二、知識點
2.1 反向代理
反向代理:普通的代理設(shè)備是內(nèi)網(wǎng)用戶通過代理設(shè)備出外網(wǎng)進(jìn)行訪問(如:vpn),而工作在這種模式下的負(fù)載均衡設(shè)備,則是外網(wǎng)用戶通過代理設(shè)備訪問內(nèi)網(wǎng)(用戶通過瀏覽器上網(wǎng)),因此稱之為反向代理。
三、思路
3.1 網(wǎng)站的訪問
兩個網(wǎng)站其實都是靜態(tài)資源,它們是存放在服務(wù)器上,然后通過相應(yīng)的地址可以訪問到
主要的問題在于: 我們通過地址怎么可以訪問到服務(wù)器上的文件夾。
兩種實現(xiàn)思路:
- 使用nginx作為反向代理服務(wù)器來處理從瀏覽器接收到的請求(nginx處理靜態(tài)資源)
- 使用nodejs來響應(yīng)從瀏覽器接收到的請求(nodejs處理靜態(tài)資源)
nginx簡單點理解:它是一個web服務(wù)器,凡是通過域名或ip地址訪問服務(wù)器,先要經(jīng)過nginx進(jìn)行處理,然后由它來轉(zhuǎn)發(fā)請求到各個不同的端口或其他服務(wù)器上?;谶@個特性,它可以作為反向代理、負(fù)載均衡器以及Http緩存(這里沒有涉及緩存),nginx是完全由配置文件控制,也就是可以直接通過配置文件來操作它
3.1.1 思路一:nginx作為反向代理服務(wù)器處理靜態(tài)資源
分為兩步:
- 準(zhǔn)備好對應(yīng)的資源
- 配置nginx
第一步:準(zhǔn)備好資源
在服務(wù)器的/www/blog/目錄下創(chuàng)建index.html文件,里面就是普通的html內(nèi)容
第二步:配置nginx
打開/etc/nginx/conf.d/文件夾,創(chuàng)建配置文件smallmage.conf,內(nèi)容如下:
server {
listen 80; // 表示http協(xié)議的端口
server_name smallmage.com; // 域名地址
location / { // 定位
root /www/blog; // 根目錄
index index.php index.html index.htm; // index定義的是首頁
}
}
上面的配置文件意思是:當(dāng)訪問http://smallmage.com這個域名地址時(http協(xié)議的默認(rèn)端口是80),就到服務(wù)器的/www/blog路徑下去取文件,默認(rèn)首頁是:index.php、index.html、index.htm,假如/www/blog文件夾下有index.php和index.html文件,則優(yōu)先返回index.php文件,也就是有優(yōu)先級的。如果沒有開啟目錄瀏覽權(quán)限,又找不到這些默認(rèn)首頁,就會報403錯誤。
nginx怎么找到/etc/nginx/conf.d/smallmage.conf這個文件呢?
該文件是在/etc/nginx/nginx.conf中會被引入,如果不確定nginx的配置文件路徑,可以通過sudo nginx -t來查看nginx的狀態(tài),從里面可以獲取到nginx的配置文件路徑,如下所示:

從
nginx.conf里面可以查找到引入的所有配置nginx的配置文件信息,如下:
注意:
- 要想通過
smallmage.com來訪問服務(wù)器,需要將smallmage.com這個域名解析到我們的服務(wù)器ip地址上,才可以通過smallmage.com來訪問 - 更改了nginx相關(guān)的配置后,需要重啟nginx,nginx命令如下:
sudo nginx -t: 查看nginx狀態(tài)
sudo nginx -s reload:重啟服務(wù)器
上面便設(shè)置了nginx作為反向代理服務(wù)器處理靜態(tài)資源
3.1.2 思路二:使用nodejs來處理靜態(tài)資源
其實就是在服務(wù)器上啟動一個nodejs服務(wù),然后通過ip地址+端口來訪問資源,由node來響應(yīng)請求,不需要配置nginx;
分為兩步:
- 編寫使用nodejs接口的js文件
- 使用node來啟動該文件
第一步:編寫使用nodejs接口的js文件
在/www/test/目錄下創(chuàng)建test.js文件,內(nèi)容如下;
const http = require('http')
http.createServer(function(req,res) {
res.writeHead(200,{'Content-Type':'text/plain'})
res.end('hello world')
}).listen(8082) // 監(jiān)聽8082端口
console.log('server test')
第二步:使用node來啟動該文件
使用node test.js來執(zhí)行該文件,當(dāng)然也可以使用pm2
假設(shè)該服務(wù)器的ip為: 123.45.67.9,那么就可以通過123.45.67.9:8082來訪問,可以在瀏覽器上看到hello world
3.2 nodejs服務(wù)(提供接口服務(wù))
接口服務(wù):就是指前端調(diào)用后端的api接口
常說的前端和后端,這里的nodejs服務(wù)(接口服務(wù))其實就是后端,也就是說我們的后端使用的是nodejs來實現(xiàn)的。
其實就是將上兩個例子結(jié)合起來,也就是:在服務(wù)器啟動一個nodejs服務(wù),然后使用nginx來作為反向代理以及負(fù)載均衡處理;
一般如果使用nodejs作為后端,會選擇一個框架進(jìn)行開發(fā),常用框架有:express、Koa
主要分為兩大步來實現(xiàn)該nodejs服務(wù):
- 編寫后端(nodejs)代碼
- 配置nginx
- 使用nginx作為反向代理
- 使用nginx處理負(fù)載均衡
3.2.1 編寫后端代碼
跟上面的使用nodejs來處理靜態(tài)資源是一樣的, 只不過是更復(fù)雜一些,需要對各個接口進(jìn)行處理,假如是一個商品接口,就需要有:goods/get、goods/add、goods/delete、goods/update等接口,這是代碼層面的;
因為我們的網(wǎng)站肯定是在服務(wù)器開機(jī)的時候一直運行的,否則我們的網(wǎng)站將無法訪問,因此需要使用一些部署工具來處理nodejs服務(wù),例如在node服務(wù)掛掉的時候可以重啟、在服務(wù)器重啟后,node服務(wù)也需要自動重啟,常用的部署工具有: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;
}
}
上面配置的意思就是:當(dāng)訪問www.smallmage.com/api時就將請求丟給proxy_pass設(shè)置的服務(wù),也就是127.0.0.1:8083,假如我們的node服務(wù)就監(jiān)聽著8083端口,那么node服務(wù)就會接收到該請求,然后再對該請求進(jìn)行處理,最后返回相應(yīng)的數(shù)據(jù)