鍍金池/ 問答/Linux/ linux使用nginx配置后沒有用

linux使用nginx配置后沒有用

我用flask框架寫好一個(gè)網(wǎng)站后,部署到了云服務(wù)器上,已經(jīng)用gunicorn部署好了,但是只能訪問程序設(shè)定的2000端口,現(xiàn)在想通過訪問默認(rèn)80端口,就能跳轉(zhuǎn)到2000端口,我使用了nginx,但是當(dāng)我配置好后發(fā)現(xiàn)怎么都不管用,具體如下

配置文件如下

server{
    listen 80;
    location / {
        proxy_pass http://localhost:2000;
    }
}

我將配置文件做了軟鏈接,linux顯示如下:

ll /etc/nginx/sites-enabled/bbs
/etc/nginx/sites-enabled/bbs -> /var/www/bbs/bbs.nginx

bbs.nginx就是配置文件,然后我重啟nginx

server nginx restart

我接下來(lái)訪問主頁(yè)時(shí)出錯(cuò)了,主頁(yè)顯示403錯(cuò)誤,主頁(yè)后面的具體某一頁(yè)顯示404錯(cuò)誤
也可能是因?yàn)殛P(guān)閉了gunicorn,因?yàn)楫?dāng)我手動(dòng)開啟gunicron時(shí),代碼如下

gunicorn wsgi --bind 0.0.0.0:2000 --pid /tmp/bbs.pid

這時(shí)候shell上只顯示

[2018-05-20 01:12:31 +0800] [1311] [INFO] Starting gunicorn 19.8.1
[2018-05-20 01:12:31 +0800] [1311] [INFO] Listening at: http://0.0.0.0:2000 (1311)
[2018-05-20 01:12:31 +0800] [1311] [INFO] Using worker: sync
[2018-05-20 01:12:31 +0800] [1314] [INFO] Booting worker with pid: 1314

在這種情況下我沒辦法輸入別的命令,只能按Ctrl+任意鍵退出,退出提示如下

[1]  + 1311 suspended  gunicorn wsgi --bind 0.0.0.0:2000 --pid /tmp/bbs.pid

這時(shí)候我才能輸入別的命令,請(qǐng)大佬幫我指出錯(cuò)誤或者給我這個(gè)小白點(diǎn)建議,不勝感激

回答
編輯回答
舊螢火

首先,你的部署思路沒搞清楚。

下面,用一個(gè)最簡(jiǎn)單的例子,來(lái)嘗試說明。

場(chǎng)景設(shè)置:

操作系統(tǒng):ubuntu 18.04 LTS
不考慮防火墻和AppArmor
python環(huán)境使用pythonenv進(jìn)行管理,路徑為/home/username/.virtualenvs/hello
假定我的Flask應(yīng)用如下/home/username/project/hello.py(摘自Flask官方文檔):

# hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

問題:如何使gunicorn在后臺(tái)運(yùn)行(daemonize)?

直接在命令行運(yùn)行g(shù)unicorn,只適合開發(fā)或者debug場(chǎng)景,生產(chǎn)環(huán)境要求gunicorn必須在后臺(tái)運(yùn)行(daemonize)。
當(dāng)然,你可以直接在terminal下運(yùn)行下面的命令,強(qiáng)制gunicorn以后臺(tái)模式(&)運(yùn)行。

gunicorn --bind /run/gunicorn/socket --pid /run/gunicorn/pid hello:app &

但是,這種模式有先天缺陷,比如使得gunicorn依賴于運(yùn)行它的terminal,從可靠性(比如當(dāng)運(yùn)行它的terminal進(jìn)程掛了,gunicorn也就掛了)和可用性(比如系統(tǒng)重啟后,gunicorn無(wú)法自動(dòng)運(yùn)行)等角度,都使這種方法不適合在生產(chǎn)環(huán)境中使用。
備注gunicorn--bind參數(shù)值設(shè)置為/run/gunicorn/socket,而不是0.0.0.0:2000,因?yàn)?code>unix socket性能高于tcp port,當(dāng)nginxgunicorn不在同一主機(jī)時(shí),則只能用tcp port。

解決辦法之一systemd

創(chuàng)建下述文件/etc/systemd/system/gunicorn.service,內(nèi)容如下:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
PIDFile=/run/gunicorn/pid # PID文件
User=www-data # 進(jìn)程所屬用戶
Group=www-data # 進(jìn)程所屬用戶組
RuntimeDirectory=gunicorn # 在/run目錄下創(chuàng)建的目錄名稱
WorkingDirectory=/home/username/project # 網(wǎng)站根目錄,根據(jù)情況進(jìn)行調(diào)整
ExecStart=/home/username/.virtualenvs/hello/bin/gunicorn --pid /run/gunicorn/pid \
          --bind unix:/run/gunicorn/socket hello:app # gunicorn命令,路徑根據(jù)情況進(jìn)行調(diào)整
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

運(yùn)行如下命令啟動(dòng)gunicorn服務(wù)并使其開機(jī)自動(dòng)啟動(dòng)。

sudo systemctl enable --now gunicorn.service

運(yùn)行如下命令查看gunicorn服務(wù)狀態(tài)。

sudo systemctl status gunicorn.service

備注:除了systemd之外,還可以使用supervisor來(lái)管理gunicorn(自行Google)。

nginx設(shè)置

server {
    listen 80;
    server_name www.yourhostname.com;
    location / {
        proxy_pass http://unix:/run/gunicorn/socket;
    }
}
2017年9月14日 19:57
編輯回答
爛人

后臺(tái)運(yùn)行命令,不影響終端輸入,可以用 & 符號(hào)在最后。如:

gunicorn wsgi --bind 0.0.0.0:2000 --pid /tmp/bbs.pid &

重啟服務(wù)用service,不是server!

service nginx restart

重啟之前要用下面的指令檢查配置文件是否正確:

service nginx configtest

啟動(dòng)之后要檢查/var/log/nginx/error.log, 看有什么出錯(cuò)信息沒有。

2018年8月13日 15:47