部署過程中主要發生一下幾個事情,個人認爲也是經常出現的問題難點,所以這裏以問題的形式進程說明。
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';
創建用戶。’%’:所有遠程主機訪問。
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
授權
用戶授權數據庫。*代表整個數據庫
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 finley@'%' 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
ps:uwsgi模塊不能安裝再虛擬環境中,退出虛擬環境在linux環境中安裝!
測試
在項目的根目錄文件下創建一個名爲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 --ini uwsgi.ini
命令運行,這裏對於存在多版本的python時,就會出現類似的錯誤如下:
WSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
Python version: 2.7.5 (default, Aug 7 2018 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Set PythonHome to /root/.virtualenvs/env3dj
ImportError: No module named site
解決此類錯誤的辦法有幾個,分別如下:
- 官方:Bonus: 多版本 Python 使用同一個 uWSGI 二進制文件
- 在python3的環境下,即使用
pip3 install uwsgi
安裝uwsgi到python3的目錄中,軟後使用軟鏈接將ln -s /usr/local/python3Dir/bin/uwsgi /usr/bin/uwsgi3
;在執行命令時修改爲:uwsgi3 --ini uwsgi.ini
配置
關於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
文件存放的目錄,不建議放在所有的/tmp/
文件下,因爲在uwsgi
運行時,unix
自覺將tmp
文件沒有訪問權限。 - 建議放在
var/run/
文件下,否則可能因爲文件權限問題導致報502的錯誤。
*3 connect() to unix:///tmp/djangoblog.sock failed (2: No such file or directory) while connecting to upstream, client:
配置uwsgi+nginx可能報502錯誤的解決辦法 參考鏈接:
https://serverfault.com/questions/504901/nginx-502-bad-gateway-runing-django-in-uwsgi