Django2.0+uwsgi+Nginx+阿里雲centos部署網站問題總結
部署過程中主要發生一下幾個事情,個人認為也是經常出現的問題難點,所以這裡以問題的形式程序說明。
1. centos系統的python3-mysql-虛擬環境
的安裝及相關配置
這個就不再詳細說明,具體參考之前寫的文章:
阿里雲Linux系統配置python3-虛擬環境-mysql --踩坑實踐(Ubuntu系統轉centOS7)
2. 專案資料上傳伺服器及相關配置
檔案上傳及資料庫遷移
- 利用
pycharm
的Tools-->Deployment-->Configuration進入如圖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