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';

創建用戶。’%’:所有遠程主機訪問。

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

解決此類錯誤的辦法有幾個,分別如下:

配置

關於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章