Ubuntu搭建web站點(diǎn)并發(fā)布公網(wǎng)訪問(wèn)詳細(xì)步驟(內(nèi)網(wǎng)穿透)
前言
網(wǎng):我們通常說(shuō)的是互聯(lián)網(wǎng);站:可以理解成在互聯(lián)網(wǎng)上的一個(gè)房子。把互聯(lián)網(wǎng)看做一個(gè)城市,城市里面的每一個(gè)房子就是一個(gè)站點(diǎn),房子里面放著你的資源,那如果有人想要訪問(wèn)你房子里面的東西怎么辦?
在現(xiàn)實(shí)生活中,去別人家首先要知道別人的地址,某某區(qū)某某街道,幾號(hào),在互聯(lián)網(wǎng)中也有地址的概念,就是ip。通過(guò)ip我們就能找到在互聯(lián)網(wǎng)上面的站點(diǎn),端口可以看做是這個(gè)房子的入口,不同的入口所看到的東西也就不一樣,如從大門(mén)(80端口)進(jìn)是客廳,從窗戶(8080端口)進(jìn)是書(shū)房。
接下來(lái)我們將通過(guò)簡(jiǎn)單幾步來(lái)在ubuntu搭建一個(gè)web站點(diǎn) html小游戲,并使用cpolar內(nèi)網(wǎng)穿透將其發(fā)布到公網(wǎng)上,使得公網(wǎng)用戶也可以正常訪問(wèn)到本地web站點(diǎn)的小游戲。
1. 本地環(huán)境服務(wù)搭建
apach2是一個(gè)服務(wù),也可以看做一個(gè)容器,也就是上面說(shuō)的房子,運(yùn)行在ubuntu里,這個(gè)服務(wù)可以幫助我們把我們自己的網(wǎng)站頁(yè)面通過(guò)相應(yīng)的端口讓除本機(jī)以外的其他電腦訪問(wèn)。
下載apach2
sudo apt install apache2 php -y
下載好后啟動(dòng)apache2
sudo service apache2 restart
然后打開(kāi)Ubuntu 瀏覽器,輸入:http://localhost 即可看到我們apache 默認(rèn)的頁(yè)面,此時(shí)說(shuō)明本地站點(diǎn)已經(jīng)搭建好了。
進(jìn)入Apache默認(rèn)服務(wù)器主目錄路徑,這個(gè)目錄放的是想要讓別人看到的資源,如一張圖片,一個(gè)html頁(yè)面等
cd /var/www/html
進(jìn)入后刪掉index.html這個(gè)文件,由于apache默認(rèn)頁(yè)面并不是我們自己想要的頁(yè)面,我們想要換成自己喜歡的頁(yè)面,所以需要?jiǎng)h掉.執(zhí)行以下命令:
sudo rm -rf index.html
為了達(dá)到測(cè)試效果,我們?cè)O(shè)置一個(gè)html頁(yè)面小游戲,創(chuàng)建名稱為game.html
的頁(yè)面
sudo vim game.html
按i
鍵 進(jìn)入編輯模式,復(fù)制以下html代碼進(jìn)去(復(fù)制全部)
<!DOCTYPE html> <html> <head><h4>Take it Easy!Please playing Game</h4></head> <body> <div></div> <!-- 4個(gè)board --> <div id="board1" style="position: absolute; width:80px; height:10px; left:420px; top:555px; background-color: cadetblue;"></div> <div id="board2" style="position: absolute; width:80px; height:10px; left:520px; top:555px; background-color: cadetblue;"></div> <div id="board3" style="position: absolute; width:80px; height:10px; left:620px; top:555px; background-color: cadetblue;"></div> <div id="board4" style="position: absolute; width:80px; height:10px; left:720px; top:555px; background-color: cadetblue;"></div> <!-- 小球 --> <div id="ball" class="circle" style="width:20px; height:20px; background-color:crimson; border-radius: 50%; position:absolute; left:600px; top:100px"></div> <!-- 框 --> <div id="box" style="border: 5px solid #555555; width:400px; height:550px; display=hide"></div> <!-- 分?jǐn)?shù) 過(guò)的board越多,分?jǐn)?shù)越高 --> <div id="score" style="width:200px; height:10px; position:absolute; left:900px; font-family:'隸書(shū)'; font-size: 30px;">score: 0</div> <!-- 游戲結(jié)束 --> <div id="gg" style="width:200px; height:10px; position:absolute; left:550px; top:200px; font-family:'隸書(shū)'; font-size: 30px; display: none;">Game Over</div> <script> // 設(shè)置box的樣式 var box = document.getElementById("box"); box.style.position = "absolute"; box.style.left = "400px"; // 設(shè)置board的樣式 var board1 = document.getElementById("board1"); var board2 = document.getElementById("board2"); var board3 = document.getElementById("board3"); var board4 = document.getElementById("board4"); // 聲音 var shengyin = new Audio(); shengyin.src = "聲音2.mp3"; shengyinFlag = 0; // 用來(lái)表示小球在第幾塊board上 // 鍵盤(pán)事件函數(shù) var ball = document.getElementById("ball"); document.onkeydown = f; function f(e){ var e = e || window.event; switch(e.keyCode){ case 37: // 按下左鍵,小球左移,但不要超過(guò)左邊框 if(ball.offsetLeft>=box.offsetLeft + 10) ball.style.left = ball.offsetLeft - 8 + "px"; break; case 39: // 按下右鍵,小球右移,但不要超過(guò)由邊框 if(ball.offsetLeft<=box.offsetLeft+box.offsetWidth-ball.offsetWidth-10) ball.style.left = ball.offsetLeft + 8 + "px"; break; case 32: } } // 定義一個(gè)分?jǐn)?shù)變量 var fenshu = 0; // 定義一個(gè)函數(shù),移動(dòng)給定的一個(gè)board function moveBoard(board) { var t1 = board.offsetTop; if(t1<=0) { // 如果board移到最上面了,就隨機(jī)換個(gè)水平位置,再移到最下面 t2 = Math.floor(Math.random() * (720- 420) + 420); board.style.left = t2 + "px"; board.style.top = "555px"; fenshu += 1; //分?jǐn)?shù)增加1 document.getElementById("score").innerHTML = "score " + fenshu; } // else board.style.top = board.offsetTop - 1 + "px"; } // 定義小球的速度變量 var startSpeed = 1; var ballSpeed =startSpeed; // step函數(shù)是游戲界面的單位變化函數(shù) function step() { // board直接上下隔得太近,就逐個(gè)移動(dòng),否則,同時(shí)移動(dòng) var t1 = Math.abs(board1.offsetTop - board2.offsetTop); var t2 = Math.abs(board2.offsetTop - board3.offsetTop); var t3 = Math.abs(board3.offsetTop - board4.offsetTop); // 定義一個(gè)board之間的間隔距離 var t4 = 140; if(t1<t4) { moveBoard(board1); } else if(t2<t4) { moveBoard(board1); moveBoard(board2); } else if(t3<t4) { moveBoard(board1); moveBoard(board2); moveBoard(board3); } else { moveBoard(board1); moveBoard(board2); moveBoard(board3); moveBoard(board4); } // 定義小球的垂直移動(dòng)規(guī)則,1、向下勻加速運(yùn)動(dòng),2、如果碰到board就被board持續(xù)抬上去, // 直到按左右鍵離開(kāi)了該board // 如果小球的縱坐標(biāo)等于某個(gè)board的縱坐標(biāo),就被抬起 var t5 = Math.abs(ball.offsetTop - board1.offsetTop); var t6 = Math.abs(ball.offsetTop - board2.offsetTop); var t7 = Math.abs(ball.offsetTop - board3.offsetTop); var t8 = Math.abs(ball.offsetTop - board4.offsetTop); if(t5<=ball.offsetHeight && t5>0 && ball.offsetLeft>=board1.offsetLeft-ball.offsetWidth && ball.offsetLeft<=board1.offsetLeft+board1.offsetWidth) { ball.style.top = board1.offsetTop - ball.offsetHeight + "px"; ballSpeed = startSpeed; if(shengyinFlag != 1) { shengyin.play(); shengyinFlag = 1; } } else if(t6<=ball.offsetHeight && t6>0 && ball.offsetLeft>=board2.offsetLeft-ball.offsetWidth && ball.offsetLeft<=board2.offsetLeft+board2.offsetWidth) { ball.style.top = board2.offsetTop - ball.offsetHeight + "px"; ballSpeed = startSpeed; if(shengyinFlag != 2) { shengyin.play(); shengyinFlag = 2; } } else if(t7<=ball.offsetHeight && t7>0 && ball.offsetLeft>=board3.offsetLeft-ball.offsetWidth && ball.offsetLeft<=board3.offsetLeft+board3.offsetWidth) { ball.style.top = board3.offsetTop - ball.offsetHeight + "px"; ballSpeed = startSpeed; if(shengyinFlag != 3) { shengyin.play(); shengyinFlag = 3; } } else if(t8<=ball.offsetHeight && t8>0 && ball.offsetLeft>=board4.offsetLeft-ball.offsetWidth && ball.offsetLeft<=board4.offsetLeft+board4.offsetWidth) { ball.style.top = board4.offsetTop - ball.offsetHeight + "px"; ballSpeed = startSpeed; if(shengyinFlag != 4) { shengyin.play(); shengyinFlag = 4; } } else { ballSpeed = ballSpeed + 0.01; // 數(shù)字相當(dāng)于加速度 ball.style.top = ball.offsetTop + ballSpeed + "px"; } // ballSpeed = ballSpeed + 0.01; // 數(shù)字相當(dāng)于加速度 // ball.style.top = ball.offsetTop + ballSpeed + "px"; // 如果小球跑出來(lái)box,就結(jié)束游戲 if(ball.offsetTop==0 || ball.offsetTop>=box.offsetTop+box.offsetHeight) { clearInterval(gameover); ball.style.display = 'none'; board1.style.display = 'none'; board2.style.display = 'none'; board3.style.display = 'none'; board4.style.display = 'none'; var gg = document.getElementById("gg"); //顯示游戲結(jié)束 gg.style.display = 'block'; } } var gameover = setInterval("step();", 8); </script> </body> </html>
復(fù)制完后按
Esc
鍵退出編輯,接著輸入冒號(hào):wq
保存退出即可
2. 局域網(wǎng)測(cè)試訪問(wèn)
接著瀏覽器輸入http://localhost/game.html,即可看到html頁(yè)面的小游戲站點(diǎn),由于部署的是靜態(tài)站點(diǎn),不需要重啟服務(wù)。
3. 內(nèi)網(wǎng)穿透
由于這個(gè)站點(diǎn)目前只能在本地被訪問(wèn)到,為了使所有人都可以訪問(wèn),我們需要將這個(gè)本地基礎(chǔ)站點(diǎn)發(fā)布到公網(wǎng)。這里我們可以通過(guò)cpolar內(nèi)網(wǎng)穿透工具來(lái)實(shí)現(xiàn),它支持 http/https/tcp協(xié)議,無(wú)需公網(wǎng)IP ,也不用設(shè)置路由器,可以很容易將本地站點(diǎn)發(fā)布到公網(wǎng)供所有人訪問(wèn)。
3.1 ubuntu本地安裝cpolar
cpolar官網(wǎng):https://i.cpolar.com/m/4jCo
cpolar支持一鍵自動(dòng)安裝腳本
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
token認(rèn)證
登錄cpolar官網(wǎng)后臺(tái),點(diǎn)擊左側(cè)的驗(yàn)證,查看自己的認(rèn)證token,之后將token貼在命令行里:
cpolar authtoken xxxxxxx
簡(jiǎn)單穿透測(cè)試,穿透成功有正常生成公網(wǎng)地址,按ctrl+c退出
cpolar http 8080
向系統(tǒng)添加服務(wù),將cpolar配置為開(kāi)機(jī)自啟
sudo systemctl enable cpolar
啟動(dòng)cpolar服務(wù)
sudo systemctl start cpolar
查看服務(wù)狀態(tài),正常顯示為active
表示啟動(dòng)成功,為正常在線狀態(tài)
sudo systemctl status cpolar
3.2 創(chuàng)建隧道
cpolar安裝成功之后,在瀏覽器上訪問(wèn)本地9200端口
,登錄cpolar web UI管理界面。
點(diǎn)擊左側(cè)儀表盤(pán)的隧道管理——創(chuàng)建隧道:
- 隧道名稱:可自定義,注意不要重復(fù)
- 協(xié)議:http
- 本地地址:80
- 端口類型:隨機(jī)域名
- 地區(qū):China vip
點(diǎn)擊創(chuàng)建
隧道創(chuàng)建成功后,點(diǎn)擊左側(cè)的狀態(tài)——在線隧道列表,可以看到剛剛創(chuàng)建的隧道已經(jīng)有生成了相應(yīng)的公網(wǎng)地址,將其復(fù)制下來(lái),接下來(lái)測(cè)試訪問(wèn)一下。
3.3 測(cè)試公網(wǎng)訪問(wèn)
打開(kāi)瀏覽器訪問(wèn)剛剛所復(fù)制的公網(wǎng)地址,注意,后面要加上路徑/game.html,出現(xiàn)游戲界面即成功。
游戲控制使用:鍵盤(pán)上下左右鍵
4. 配置固定二級(jí)子域名
由于以上所創(chuàng)建的隧道選擇的是隨機(jī)域名,所生成的公網(wǎng)地址會(huì)在24小時(shí)內(nèi)隨機(jī)變化,對(duì)于需要長(zhǎng)期訪問(wèn)的用戶來(lái)講較為不方便。不過(guò)我們可以為其配置一個(gè)固定的二級(jí)子域名來(lái)進(jìn)行訪問(wèn),改地址不會(huì)隨機(jī)變化。
注意:配置固定二級(jí)子域名功能需要升級(jí)至基礎(chǔ)版套餐或以上才支持。
4.1 保留一個(gè)二級(jí)子域名
登錄cpolar官網(wǎng)后臺(tái),點(diǎn)擊左側(cè)的預(yù)留,找到保留二級(jí)子域名:
- 地區(qū):選擇China VIP
- 二級(jí)域名:可自定義填寫(xiě)
- 描述:即備注,可自定義填寫(xiě)
點(diǎn)擊保留
提示子域名保留成功,復(fù)制所保留的二級(jí)子域名
4.2 配置二級(jí)子域名
訪問(wèn)本地9200端口登錄cpolar web UI管理界面,點(diǎn)擊左側(cè)儀表盤(pán)的隧道管理——隧道列表,找到所要配置的隧道,點(diǎn)擊右側(cè)的編輯
修改隧道信息,將保留成功的二級(jí)子域名配置到隧道中
- 域名類型:選擇二級(jí)子域名
- Sub Domain:填寫(xiě)保留成功的二級(jí)子域名,本例為test01
點(diǎn)擊更新
提示更新隧道成功,點(diǎn)擊左側(cè)儀表盤(pán)的狀態(tài)——在線隧道列表,可以看到公網(wǎng)地址已經(jīng)更新為保留成功的二級(jí)子域名,將其復(fù)制下來(lái)。
4.3 測(cè)試訪問(wèn)公網(wǎng)固定二級(jí)子域名
我們使用任意瀏覽器,輸入剛剛配置成功的公網(wǎng)固定二級(jí)子域名+/game.html即可看到我們創(chuàng)建的站點(diǎn)小游戲
總結(jié)
到此這篇關(guān)于Ubuntu搭建web站點(diǎn)并發(fā)布公網(wǎng)訪問(wèn)的文章就介紹到這了,更多相關(guān)Ubuntu搭建web站點(diǎn)并公網(wǎng)訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法
這篇文章主要介紹了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法,較為詳細(xì)的講述了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的具體步驟與相關(guān)設(shè)置技巧,需要的朋友可以參考下2018-01-01在linux中用同一個(gè)版本的R 同時(shí)安裝 Seurat2 和 Seurat3的教程
這篇文章主要介紹了在linux中用同一個(gè)版本的R 同時(shí)安裝 Seurat2 和 Seurat3的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08linux系統(tǒng)Ansible自動(dòng)化運(yùn)維部署方法
在本篇文章里小編給大家整理了關(guān)于linux系統(tǒng)Ansible自動(dòng)化運(yùn)維部署方法以及知識(shí)點(diǎn)總結(jié),需要的朋友們參考下。2019-06-06搭建一個(gè)大型網(wǎng)站架構(gòu)的實(shí)驗(yàn)環(huán)境(Squid緩存服務(wù)器篇)
Squid是一個(gè)高性能的代理緩沖服務(wù)器,也許你已經(jīng)用過(guò)Windows平臺(tái)下的WinGate,MS Proxy Server等功能類似的產(chǎn)品。2009-07-07淺析Docker私有鏡像庫(kù)與阿里云對(duì)象存儲(chǔ) OSS
在本篇文章中我們給大家分享了關(guān)于Docker私有鏡像庫(kù)與阿里云對(duì)象存儲(chǔ) OSS的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。2018-09-09