搜尋此網誌
由於從事Client端工作較多年,所以可能相關的領域較為了解,但是程式這種職業,其實能拆分細數成無數分支的程式職業,每個不同的程式區塊都是隔行如隔山,不同公司的習慣與水平都有著巨大的差距,所以看到不同的寫法也許只是習慣不同,而大家也都是希望遊戲領域或是程式領域能發展的更好,所以歡迎討論,但是希望避免那種都沒說明就說別人錯誤的狀況~
精選
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
遊戲伺服器2025年初架設與研究part9簡單介紹Gunicorn + Flask與Uvicorn + FastAPI並簡單架設
先前針對我們Nginx的搭配使用
已經可以簡單的做到基本的https設置
那接下來分別進行兩組插件進行分享
分別是Gunicorn + Flask
跟Uvicorn + FastAPI
首先簡單介紹一下這兩個組合主要功能是應對什麼
兩個組合都可以很好的應用在伺服器運行上
舉例來說Flask跟FastAPI就是框架的腳色
而Gunicorn 跟Uvicorn 則是伺服器的腳色,也就是啟動Http服務等等
並且主要的部署方式為systemd
+
Nginx
+
Supervisor
先前已經有使用了
systemd
+ Nginx
首先兩者都有各自的優缺點
不過Uvicorn + FastAPI算是比較年輕的,是比較新的插件
所以要當伺服器功能的話能查到比較多資料的是Gunicorn + Flask
主要差異的話FastAPI是異步運行(非同步)
而Flask則是同步運行
所以理論上效能FastAPI會比較好
這邊也簡單的介紹一下兩種用法
首先是安裝
安裝前記得先切到虛擬環境之中(前面有帶venv)
pip install flask gunicorn
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def hello():
return jsonify(message="Hello, Flask + Gunicorn!")
if __name__ == "__main__":
app.run()
新增一個python檔案寫入以上的內容,python檔案假設取名為main.py
其中最後的__name__的部分是直接執行python才會使用到
不過剛開始可以直接執行先測試看看有沒有直接報錯(之後可以拿掉)
接下來可以到我們的Nginx,這邊新增設定檔可以參考先前的文章
那主要就是以下的指令
sudo nano /etc/nginx/sites-available/各自的設定檔名稱
server_name 自己的網域 www.自己的網域;
location / {
proxy_pass http://127.0.0.1:7899;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
7899可替換自己想要監聽的port
接下來請建立服務檔來執行,當然這邊也可以透過gunicorn 指令直接執行
gunicorn --workers 4 --bind 0.0.0.0:7899 main:app
那加到服務中就可以開機後自動啟動
如以下方式
sudo nano /etc/systemd/system/your_main.service
這邊服務新增方式如同之前有講過的,是一樣的東西
先建立一個服務檔案,接下來在裡面輸入以下內容
[Unit]
Description=Flask Gunicorn
After=network.target
[Service]
User=自己的User
Group=自己的Group(好像可以不用)
WorkingDirectory=/home/User/專案路徑(要執行的python位置)
ExecStart=/home/User/專案路徑/venv/bin/gunicorn --bind 127.0.0.1:7899 main:app
Restart=always
Environment="PATH=/home/User/專案路徑/venv/bin"
[Install]
WantedBy=multi-user.target
關鍵就是ExecStart的部分,那邊讓gunicorn去執行你的腳本
那這邊記得都使用虛擬環境下的路徑,如果沒有用虛擬環境則是找到對應路徑即可
服務檔案處理完畢後
sudo systemctl daemon-reload
先reload
接著是啟動你的服務檔
sudo systemctl enable your_main
sudo systemctl start your_main
記得檔名請換成自己取的
這樣就可以簡單的建立伺服器的效果(可以測試在瀏覽器輸入自己的網域)
當然需要什麼內容就可以在python內加入
接下來是
pip install fastapi uvicorn[standard]
一樣記得建議在虛擬環境中安裝
接下來一樣的使用步驟,整理算是非常相似
這邊一樣提供一個很簡單的範例
首先新增main.py
或是自己想要的名字,或是不想跟剛剛重覆名稱可以改個main2.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello, FastAPI + Uvicorn!"}
裡面內容打這樣
並且如果想直接用指令執行腳本可以打以下的指令
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
那這邊只是測試使用就好,因為0.0.0.0會對所有IP的8000port都開放
測試可以運行就可以先關閉了
那接下來一樣是去調整Nginx設定檔
sudo nano /etc/nginx/sites-available/各自的設定檔名稱
並在設定檔的區域加入以下內容
server_name 自己的網域 www.自己的網域;
location / {
proxy_pass http://127.0.0.1:7899/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
這邊沒有限制不能與先前的Flask共用
但是要注意port要分開,並且不能監聽同一個網址
也就是說如果兩種都想要用其中一個的location /要改成別的
這邊舉例可以換成location /uvicorn/
不過瀏覽的時候就要記得網域後面要記得加/uvicorn
這樣才看的到這邊的內容,並且上面的server_name只要加一次
不用重複加兩次server_name
接下來一樣是服務檔的新增
這邊如果大家想跟上面的設定檔都保留的話,可以設置不同的檔名
當然如果希望先中止服務也可以輸入以下的指令來先中止服務
sudo systemctl stop 自己要中止的服務檔.service
這邊同時運行多個服務也不會有問題,所以先前的保持運行也沒問題
只要注意不要使用到同一個port跟location /
[Unit]
Description=FastAPI App via Uvicorn
After=network.target
[Service]
User=自己的User
Group=自己的Group(好像可以不用?)
WorkingDirectory=/home/User/專案路徑
Environment="PATH=/home/User/專案路徑/venv/bin"
ExecStart=/home/User/專案路徑/venv/bin/uvicorn \
main2:app \
--workers 4 \
--host 0.0.0.0 \
--port 7899
[Install]
WantedBy=multi-user.target
之後透過一樣的方式
sudo systemctl daemon-reload
先reload接著是啟動你的服務檔
sudo systemctl enable 自己的服務檔名稱
sudo systemctl start 自己的服務檔名稱
運行後就可以去瀏覽器確認一下是否有看到內容
那如果運行有問題
這邊也提供可以看目前服務運行狀態的指令(可以看到執行錯誤)
sudo systemctl status 自己的服務檔名稱.service那如果腳本有改,可以透過以下指令重新讀取後開啟
sudo systemctl restart 自己的服務檔名稱.service
那這樣這兩種伺服器就可以簡單的架設了出來
也可以透過對應的網域跟網域+自己輸入的網址來查看對應內容了
這次也就分享到這邊
兩種不同的方式都可以快速的架設出網站與伺服器,相當便利且好用
如果還有什麼疑問也可以提出,或是有什麼講錯的地方也歡迎指正
熱門文章
遊戲伺服器2025年初架設與研究part7遊戲中常見的websocket使用,並且在Unity與伺服器中建立連線
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
留言
張貼留言