? ? ? ? 1 前言
????????說實話,我并不想接觸linux系統,要記住太多的命令。我更習慣windows系統,鼠標點點,只要記住少量的命令就可以了。
? ? ? ? 但是我選擇了python,就注定無法逃避linux系統。雖然python也能在windows上很好的運行,但根據我的觀察,python更適合在linux系統上運行(在windows上,跟C#這類語言比,感覺python就像外人)。
? ? ? ? 既然躲不過,那就開干。就像我不想學JavaScript一樣,但涉及前端就躲不開它。誰讓咱是全(guang)棧(gan)開(si)發(ling)呢😂?
? ? ? ? 我決定從流行的ubuntu開始(雖然樹莓派的官方系統之前用過,不過不是當服務器用的,而且也多用的是圖形界面)。
????????正好我要參加一個考試,給了一個pdf題庫,只要背題就可以了。作為程序員怎么可能直接在pdf里面背題呢??做個答題系統不香嗎?我決定先用ai做個簡易答題系統,在ubuntu?server上部署,先用起來再說。
????????2?準備部署環境
????????2.1?更新服務器
????????確保目標服務器上的軟件是最新的,使用如下命令來更新Ubuntu服務器:
sudo apt update
sudo apt upgrade
????????2.2?安裝python和pip
????????Flask需要Python環境。確保目標服務器上安裝了Python 3和pip。
sudo apt install python3 python3-pip
????????一般情況下系統已經自帶,無需安裝。
????????2.3?安裝虛擬環境組件,并建立虛擬環境
? ? ? ? 使用如下命令安裝組件:
sudo apt install python3-venv
????????定位到項目部署目錄,執行如下命令:
python3 -m venv myprojectenv
????????注意:這里的“myprojectenv”是虛擬環境所在文件夾名稱,可以根據自己的需要換成其他名稱。
????????2.4?激活虛擬環境
????????運行如下命令來激活虛擬環境:
source myprojectenv/bin/activate
? ? ? ? 注意:?這里的“myprojectenv”是自定義的虛擬環境目錄名稱
????????3?安裝項目依賴的模塊
? ? ? ? 將項目代碼上傳到服務器的部署目錄下,記得先在開發環境使用“pip freeze > requirements.txt”命令生成requirements.txt文件
? ? ? ? 在服務器上已經激活的虛擬環境里安裝依賴:
pip install -r requirements.txt
????????4?使用tornado作為wsgi
? ? ? ? ????????在項目中使用tornado模塊來創建,示例如下:
? ? ? ? app.py的內容
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello, World!"
run.py的內容
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from app import app # 導入你的Flask應用http_server = HTTPServer(WSGIContainer(app))
http_server.listen(8000) # 定義監聽的端口
IOLoop.current().start() # 啟動事件循環
????????5?運行項目
????????用上面的例子,在已經激活的虛擬環境中執行如下命令來運行項目:
python run.py
????????這時可以使用? ?http://ip地址:8000/? 來訪問。不過該方法的缺點是退出終端窗口后,程序也退出運行。要在后臺運行,可以使用nohup命令:
nohup python run.py &
? ? ? ? 我的答題系統運行界面如下,真的很簡易:
????????6?使用nginx作為反向代理
? ? ? ? 還可以再在外面加一層反向代理,應該可以讓系統更穩定可靠吧。我用的是nginx。
? ? ? ? 6.1?安裝nginx
sudo apt install nginx
? ? ? ? 6.2?配置nginx
?????????創建Nginx配置文件?,為該項目創建一個單獨的Nginx服務器配置文件。
sudo nano /etc/nginx/sites-available/myapp
????????這里的“myapp”是自定義的配置文件名稱。添加的內容示例:
server {listen 80; #監聽端口server_name localhost;server_name 0.0.0.0; #對外網開放location / {proxy_pass http://127.0.0.1:8000; #轉發的網址,即wsgi訪問的地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /static/ {alias /path/to/your/app/static/;}
}
????????proxy_set_header用來將原始請求的頭部信息傳遞給后端,確保應用能獲取正確的客戶端ip和主機名?
????????location /static/ 定義了如何處理靜態文件的請求。
????????alias /path/to/your/app/static/; 表示靜態文件的路徑。需要將 /path/to/your/app/static/ 替換為你的應用靜態文件的實際路徑,例如 /home/user/myapp/static/。?這樣靜態文件的請求就直接在這里發給前端,無需經過后端,減小后端的壓力。
????????6.3?激活nginx配置
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
????????以上的路徑要根據實際情況替換,命令解釋如下:
sudo ln -s ...
? 這個命令創建了一個符號鏈接,將你的配置文件從 sites-available
目錄鏈接到 sites-enabled
目錄,從而啟用該配置。
sudo nginx -t
? 這個命令用于測試 Nginx 配置文件的語法是否正確。如果沒有錯誤,它會輸出 syntax is ok
和 test is successful
。
sudo systemctl restart nginx
? 這個命令重啟 Nginx 服務,使新的配置生效。
? ? ? ? 6.4 給nginx分配訪問文件的權限
????????查看 Nginx 運行用戶:
ps aux | grep nginx
????????通常 Nginx 的工作用戶是 www-data
或 nginx
????????修改文件夾權限:
????????將 static
文件夾及其內容的所有者設置為 Nginx 用戶,并確保文件夾有讀取權限:
sudo chown -R www-data:www-data /path/to/your/static
sudo chmod -R 755 /path/to/your/static
????????如果使用的是 nginx
用戶,將上述命令中的 www-data
替換為 nginx
????????檢查父目錄權限:
????????確保所有父目錄(如 /path/to/your/
)對 Nginx 用戶開放執行權限:
sudo chmod o+x /path/to/your
????????6.5?nginx的維護
一般情況下nginx服務已經運行了。可以使用“sudo systemctl restart nginx
”?重啟服務,還可以使用“tail -f /var/log/nginx/error.log”查看錯誤日志,了解運行情況。
7?后記
? ? ? ? 雖然目前并沒有使用linux系統的需求,但作為技術儲備也好,發覺linux的未來發展前景也罷,總要學習一點的。
? ? ? ? 現在部署的答題系統設計的非常簡易,代碼很少,基本是ai給出的,沒有用戶管理只支持一個人答題。計劃等考完繼續升級,不但支持多用戶,還要能使用小程序在手機上打開,再在gitcode上開源發布。趁著這個項目,既熟悉linux系統,又能學習小程序開發和發布開源項目,可謂一舉多得。