前陣子組裝了一個主機,然后在主機上搭建了一個Linux的服務器,這里主要記錄其流程和碰到的問題。
1. 安裝Ubuntu Server 20.04
制作U盤啟動盤並安裝
- Mac系統下推薦balenaEtcher工具燒錄U盤鏡像。具體參考https://cto.eguidedog.net/node/826、
- 設置U盤啟動並安裝https://www.jianshu.com/p/da49cd69e8ff
注意Ubuntu Server版本並沒有圖形界面,因此后續的安裝都需要鍵盤配合完成。
無線上網
Ubuntu Server默認沒有無線客戶端,需要安裝一個客戶端之后才能配置無線,這段時間需要先連網線上網。
- 安裝wpasupplicant客戶端,參考https://askubuntu.com/questions/1249160/connecting-to-personal-wifi-on-ubuntu-server-20-04
- 配置無線網和密碼,https://linuxconfig.org/ubuntu-20-04-connect-to-wifi-from-command-line
完成上述兩個步驟之后就可以愉快無線上網了,配置無線網的時候,注意網卡名,一般比較長,輸入的時候多檢查一下。
SSH上網
如果在安裝的時候沒有勾選ssh服務,這一步可能需要手動安裝ssh后才能使用ssh,參考https://blog.csdn.net/qq_34814495/article/details/108739713
配置ssh key等內容可以參考之前的博客https://lfeng.tech/2019/09/20/Linux-VPS-configure/
其他問題
安裝軟件包遇到鎖的問題
ubuntu未使用全部磁盤
開機等待網絡連接
開機時間長,顯示A start job is running for wait for network to be configured,可以設置網絡連接為optional。
使用python3為默認的python
sudo apt install python-is-python3 這樣當升級python后依然有效,比alias方便。
2. 外網訪問家庭Ubuntu服務器
外網訪問ubuntu家庭服務器的核心,就是如何找到家庭內網環境中的Ubuntu,具體來講根據能否獲取公網ip,可以分為如下兩種方案:
-
有公網ip,對於家庭環境,可以采用路由器撥號上網,獲取ip,然后設置端口轉發即可。如果是非固定公網ip,可以采用ddns綁定免費域名進行訪問,也可以利用dnspod等提供的api動態刷新ip來綁定頂級自定義域名。
-
無公網ip,需要內部ubuntu和公網的server之間建立內網穿透,實現在公網訪問內部ubuntu的目的。
-商業服務:花生殼、ngrok等,主要缺點免費版本速度慢、安全性問題。
-自建服務:在一台有公網ip的機器上配置frp,和本地局域網中的ubuntu建立連接,實現內網穿透。
由於家中寬帶無公網ip,以及出於安全考慮,我在利用騰訊vps配置了frp,來和本地局域網ubuntu連接,實現內網穿透。這樣內網的端口就可以暴露到外網,並且可以綁定域名進行訪問。
第一次登錄騰訊ubuntu:先使用網頁版設置root以及個人用戶,賬號和密碼
設置root用戶密碼:sudo passwd root
以后切換root用戶只需:su root。
如何配置frp可以參考官方git的readme,后續也會講到。
3. 映射Http服務
這節主要介紹如何將家庭ubuntu上的http服務暴露到公網,以下是整個原理結構。瀏覽器在訪問域名時,nginx把80和443的請求都轉發到本機的5000端口;frp運行通過8000端口與本地的ubuntu server進行通信,然后將本地的5000端口也映射到服務器的5000端口,這樣通過外網就可以訪問到家里的http服務了。
准備工作:
- VPS安裝好Nginx,frp,綁定好對應的域名。https證書可以參考https://www.v2fy.com/p/2021-06-27-nginx-https-1624774964000/,注意可能需要切換證書服務商(acmesh issue證書問題,切換默認服務器到letsencrypt acme.sh --set-default-ca --server letsencrypt)
- Ubuntu server上同時安裝好frp。
VPS端配置
配置Nginx轉發
主要兩個功能,一是將80同時轉發到443,強制https驗證。二是將443的流量轉發到本地5000端口。可以新建abc.lfeng.tech.conf,填入下面內容:
server {
listen 80;
listen [::]:80;
server_name abc.lfeng.tech;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name abc.lfeng.tech;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host:443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
ssl_certificate "/etc/nginx/ssl/abc.lfeng.tech/fullchain.cer";
ssl_certificate_key "/etc/nginx/ssl/abc.lfeng.tech/abc.lfeng.tech.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
frp配置
編輯frps.ini並填入以下內容:
[common]
bind_port = 8000
vhost_http_port = 5000
這樣將ubuntu server上的5000在vps上暴露出來。
Ubuntu Server配置
ubuntu這邊比較簡單,不需要配置ssl證書用於https驗證, 也不需要nginx,只需要配置好frpc.ini就好了。
[common]
server_addr = 8.8.123.123
server_port = 8000
[web]
type = http
local_port = 5000
custom_domains = abc.lfeng.tech
[webs]
type = https
local_port = 5000
custom_domains = abc.lfeng.tech
注意需要把https和http全部配置上去,這樣直接就可以通過abc.lfeng.tech來加密訪問本地的5000端口上的http服務了。
參考: