1. 程式人生 > >Django2.0+uwsgi+Nginx+阿里雲centos部署網站問題總結

Django2.0+uwsgi+Nginx+阿里雲centos部署網站問題總結

部署過程中主要發生一下幾個事情,個人認為也是經常出現的問題難點,所以這裡以問題的形式程序說明。

1. centos系統的python3-mysql-虛擬環境的安裝及相關配置

這個就不再詳細說明,具體參考之前寫的文章:
阿里雲Linux系統配置python3-虛擬環境-mysql --踩坑實踐(Ubuntu系統轉centOS7)


2. 專案資料上傳伺服器及相關配置

檔案上傳及資料庫遷移

  • 利用pycharm的Tools-->Deployment-->Configuration進入如圖1所示介面,在圖2中根據伺服器情況進行配置。配置完成後將檔案上傳到伺服器。
    圖1.同步設定路徑
    圖2.同步到伺服器檔案配置
  • 資料庫配置:
    在伺服器上建立資料庫,並建立使用者及授權
create database mydb charset utf8;
use mydb;

建立使用者
create user ‘[使用者名稱稱]’@’%’ identified by ‘[使用者密碼]’;
建立使用者。’localhost’,代表只能本地訪問,例如root賬戶預設為‘localhost‘。

mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';1

建立使用者。’%’:所有遠端主機訪問。

mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';1

授權
使用者授權資料庫。*代表整個資料庫

GRANT privileges ON databasename.tablename TO ‘username’@’host’ [with grant option ] 

with grant option:允許被授予許可權的人把這個許可權授予其他的人。
一般用不到。實際中,資料庫許可權最好由 DBA 來統一管理。

mysql> GRANT SELECT,UPDATE ON test to testuser21

授權使用者只能本地訪問

mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'
    ->     WITH GRANT OPTION;12

授權使用者可以遠端訪問

mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'
    ->     WITH GRANT OPTION;12

-- finley對test有所有許可權。

mysql> GRANT ALL PRIVILEGES ON test.* TO 'finley'@'%' IDENTIFIED BY 'some_pass';12
-- finley對test有select,delete,update,create,drop許可權。
mysql> GRANT SELECT,DELETE,UPDATE,CREATE,DROP ON test.* TO [email protected]'%' IDENTIFIED BY 'some_pass';12

重新載入賦權表

mysql> FLUSH PRIVILEGES;1

要遠端連線,還需要設定/etc/mysql/mysql.conf.d/mysqld.cnf

#只允許localhost訪問
#bind-address = 127.0.0.1
bind-address = 0.0.0.0123

解除授權
revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from”:

--解除使用者所有資料庫(表)的所有許可權(不包含賦權許可權) 
mysql> REVOKE ALL PRIVILEGES ON *.* FROM finley;
--解除賦權許可權  
mysql> REVOKE GRANT OPTION ON *.* FROM finley;  1234

刪除使用者

mysql> DELETE FROM mysql.user WHERE user='finley';1

設定與更改使用者密碼

SET PASSWORD FOR ‘username’@’host’ = PASSWORD(‘newpassword’); 

如果是當前登陸使用者用:
SET PASSWORD = PASSWORD(“newpassword”);

mysql> SET PASSWORD FOR 'finley'@'%' = PASSWORD("123456");

修改settings.py檔案

  • ALLOWED_HOSTS = ['127.0.0.1','伺服器對外ip']或者ALLOWED_HOSTS = [‘*’]
  • 配置static根檔案目錄:STATIC_ROOT = os.path.join(BASE_DIR,'static_dist')
  • 將資料庫的配置資訊進行核對和修改
  • 測試成功後,將DEBUG = False

測試

進入專案根目錄執行如下命令,在瀏覽器中檢視,對比DEBUG關閉前後狀態:

# 注意這裡需要開啟伺服器對應埠的訪問許可權
python manage.py runserve 0.0.0.0:8000

收集靜態檔案

python manage.py collectstatic

3. uwsgi安裝、測試及配置

安裝

因為centos系統中的python3是後來配置的,這裡需要先執行如下命令,在安裝,否則直接安裝會報錯:

yum install python-dev

安裝uwsgi:

pip install uwsgi

測試

在專案的根目錄檔案下建立一個名為test.py的檔案檔案內容如下:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

完成後,在該目錄下,執行如下命令,然後訪問對應的ip和埠,檢視是否返回Hello World,返回就說明成功:

uwsgi --http :80 --wsgi-file test.py

配置

關於uwsgi的檔案配置,都是與nginx相互配合的,這裡我們使用socket也配置:
在專案根目錄下建立一個名為:uwsgi.ini的檔案,配置如下:

[uwsgi]

# Django相關配置
# 必須全部為絕對路徑
# 專案路徑
chdir=/home/study/django/django_01

# Django的wsgi檔案
module=django_01.wsgi

# python虛擬環境的路徑
home=/root/.virtualenvs/django_01

# 程序相關的設定
# 主程序
master=true
# 最大數量的工作程序
processes=10
# socket檔案路徑,絕對路徑
# 該路徑自己指配,但是要保持與nginx/conf.d中配置的.socket路徑一致
socket=/var/run/django_01.sock
# 設定socket的許可權 絕對路徑
chmod-socket=666
# 退出時是否清理環境
vacuum=true

# 日誌記錄
#logoto         = /tmp/django_01_uwsgi.log

常用的uwsgi命令:

#啟動:uwsgi –-ini 配置檔案路徑 例如:
uwsgi –-ini uwsgi.ini
#停止:uwsgi --stop uwsgi.pid路徑 例如:
uwsgi –-stop uwsgi.pid

4. Nginx安裝、測試及配置

安裝

首先,我們還要先新增 EPEL 包的倉庫源。使用如下命令

yum -y install epel-release

然後再執行安裝Nginx命令。

yum -y install nginx

安裝完成後,啟動nginx

# 啟動
service nginx start
# 關閉
service nginx stop
# 重啟
service nginx restart

測試

安裝完成後,可以直接在本地的瀏覽器上,訪問,伺服器的ip,看介面是否返回一個nginx介面。

配置

在目錄/etc/nginx/conf.d下建立一個xxx.conf的檔案,檔案配置如下:

upstream django_01{
        server unix:///var/run/django_01.sock;
}
# 伺服器配置
server {
        # 監聽埠
        listen          80; # 建議80埠
        # 域名
        server_name     xxx.xxx.xxx.xxx;# 域名或伺服器ip
        charset         utf-8;

        # 最大檔案上傳尺寸
        client_max_body_size    75M;

        # 靜態檔案訪問的url
        location /static {
                # 靜態檔案地址
                alias /home/study/django/django_01/static_dist;
        }

        # 最後,傳送所有的非靜態檔案請求到django伺服器
        location / {
                uwsgi_pass django_01;
                # uwsgi_params檔案地址
                include         /etc/nginx/uwsgi_params;
        }
}

每次更改nginx檔案後,都需要重啟。
配置完成後,執行如下命令,無錯誤時,就可以使用對應的ip或者域名進行網站的訪問了。

uwsgi --ini uwsgi.ini
注意事項
  • 關於使用socket進行伺服器間通訊,xxx.sock檔案存放的目錄,建議放在var/run/檔案下,否則可能因為檔案許可權問題導致報502的錯誤。

配置uwsgi+nginx可能報502錯誤的解決辦法 參考連結:
https://serverfault.com/questions/504901/nginx-502-bad-gateway-runing-django-in-uwsgi