1. 程式人生 > >Centos7+nginx+uwsgi來部署我的Django專案

Centos7+nginx+uwsgi來部署我的Django專案

前不久寫了個小的部落格專案,想著將它部署到伺服器上去,因為是第一次部署專案,有很多的東西都不這麼懂,走了很多的彎路,現在部署成功了,怕以後忘記了就記錄下筆記

首先我的專案結構如下:

關於伺服器的遠端連線,我用的伺服器是阿里雲的輕量應用伺服器,連線資料庫的軟體通過WinSCP來連線我的伺服器

這裡我將我的伺服器重置為CentOS 7.3 ,系統重置後原來的金鑰還存在,但是不能通過驗證,重新再獲取金鑰然後通過puttygen.exe軟體來轉為 .ppk 私鑰檔案。這部分操作參考:遠端連線到Linux作業系統例項

WinSCP連線成功後

通過ctrl+p來開啟putty,前提得安裝了putty,在putty中進行命令安裝。

需要安裝的東西:python3.6.7, MySQL8.0,nginx,uwsgi,django2.1

1,安裝nginx,安裝epel-release源進行安裝

yum install epel-release
yum update
yum install nginx

防火牆執行相關的應用操作:

systemctl start nginx #啟動
systemctl stop nginx #停止
systemctl restart nginx #重啟
systemctl status nginx #檢視執行狀態
systemctl enable nginx #開機啟動

防火牆的設定

如果出現啟動後無法通過IP訪問,需要進一步設定防火牆:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

nginx的啟動和關閉

pkill -f nginx  #關閉
nginx    #啟動

綠色狀態就是啟動成功

總之,在瀏覽器輸入你的伺服器公網IP能出現下面頁面應該就是成功的


2,MySQL8.0的安裝和資料傳輸。

不同CentOS的系統安裝的MySQL包是不同的,我的Centos系統是7.3版本的,所以安裝的版本是el7

EL6 is the download for Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x. 
EL7 is the download for Red Hat 7.x, CentOS 7.x, and CloudLinux 7.x.

下載

從MySQL Yum 倉庫:http://dev.mysql.com/downloads/repo/yum/下載合適自己電腦版本的rpm包。

1、yum倉庫下載MySQL:sudo yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

2、yum安裝MySQL:sudo yum install mysql-community-server

3、啟動MySQL服務:sudo service mysqld start

4、檢查MySQL服務狀態:sudo service mysqld status

5、檢視初始密碼(如無內容直接跳過):sudo grep 'temporary password' /var/log/mysqld.log
    

6. 更改密碼:
建議直接 vim /etc/my.cnf ,在配置檔案中新增 skip-grant-tables(跳過密碼驗證),然後再 mysql -u root -p 登入
 use mysql; ---> update user set authentication_string='' where user='root';(將root密碼置空)
    --->刪除my.cnf中的skip-grant-tables --->service mysqld restart(重啟MySQL服務)--->登入MySQL
    --->mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'Root123!';(密碼太簡單不會通過)

 修改配置檔案:

vim /etc/my.cnf 

[mysqld]
# 新增編碼配置
character_set_server=utf8
init_connect='SET NAMES utf8'
# 設定外部IP可以訪問
bind-address = 0.0.0.0

關於MySQL8.0版本的遠端訪問許可權設定:

以前可以直接使用:GRANT ALL ON *.* TO 'root'@'%';授權root使用者的所有許可權並設定遠端訪問,但是新版本MySQL將建立使用者和賦值許可權的方式分開了,所以執行: GRANT ALL ON *.* TO 'root'@'%'; 會提示:ERROR 1410 (42000): You are not allowed to create a user with GRANT

解決方法:

1,為MySQL建立使用者:rong, 密碼為:
CREATE USER rong IDENTIFIED BY 'Root123!';

2,給使用者授權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='rong';

關於使用Navicat等視覺化工具連線MySQL時會提示2059錯誤,這是因為 MySql8.0版本和舊版本的加密規則不一樣,剛剛測試發現沒有改加密規則Navicat好像也能直接連線阿里雲的MySQL,可能是後面最新版本的Navicat可能升級了加密規則,可以直接連線MySQL8.0版本

使用Navicat等視覺化工具連線時輸入使用者,密碼,會提示2059錯誤,這是因為 MySql8.0版本和舊版本的加密規則不一樣,
而現在的視覺化工具只支援舊的加密方式,所以需要更改MySQL8.0使用者登入的加密規則:mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 修改加密規則
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 更新root使用者密碼

開啟防火牆的埠設定

CentOS7的預設防火牆為firewall,預設是不開啟的。

systemctl start firewalld    #啟動friewall
systemctl status firewalld 檢視firewall啟動情況
firewall-cmd --zone=public --add-port=3306/tcp --permanent 開啟3306埠
firewall-cmd --reload  #重啟防火牆
firewall-cmd --list-ports   #檢查開啟的埠

對了,如果用的阿里雲伺服器還需要到控制檯開啟對應的埠(3306),不然還是連線不上MySQL


安裝python3.6

Centos7預設安裝的是python2.7.5,我們可以通過 python -V來檢視pyhton版本,然後使用命令 which python 檢視一下Python可執行檔案的位置。

安裝相關包,增加編譯功能,防止安裝python出現各種異常

1.安裝相關包:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
    2.編譯安裝python3:
        wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
    3.解壓:tar -xvJf  Python-3.6.7.tar.xz
    進入到解壓後的目錄: cd Python-3.6.7
    4.編譯安裝:
        ./configure prefix=/usr/local/python3  
        make && make install
    新增軟連線:
        ln -s /usr/local/python3/bin/python3 /usr/bin/python3

    安裝pip3
        將之前安裝的python3中的pip3新增上軟連線就可以:ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

通過 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz 來下載安裝包,中間最好不要有斷網的,不然後面進行編譯安裝可能會出現問題

更新pip:

pip install --upgrade pip(預設更新python2的pip)
pip3 install --upgrade pip 更新python3的pip

建立虛擬環境

1,安裝安裝virtualenv
    pip install virtualenv   #安裝到python2中
    pip3 install virtualenv  #安裝到python3中
2,安裝virtualenvwrapper
    pip install virtualenvwrapper   #安裝到python2中
    pip3 install virtualenvwrapper   #安裝到python3中
    需要注意的是這兩個都得裝,如果只裝python3的話,workon命令是用不了的。
3,查詢位置:
    find / -name virtualenvwrapper.sh
4,編輯配置檔案
    cd~  -->  vim ~/.bashrc
    新增下面兩個命令到最後,用來指定虛擬環境的位置。
        export WORKON_HOME=~/.virtualenvs
        source /usr/local/python3/bin/virtualenvwrapper.sh
    執行.bashrc使檔案生效: source ~/.bashrc
5,建立虛擬環境
    mkvirtualenv -p /usr/bin/python3 env_name  (最後的env_name為虛擬環境的名稱)

建立完虛擬環境後通過下面命令匯出我們的專案依賴的包(在pycharm中執行),然後在安裝

pip freeze > requirements.txt # 匯出專案依賴的包名到檔案中
在虛擬環境中安裝requirements.txt檔案中所有的包(requirements.txt檔案通過WinSCP軟體上傳到CentOS上去)
通過workon命令就可以檢視所有虛擬環境的目錄,workon env_name 進入該虛擬環境, deactivate退出虛擬環境,(刪除虛擬環境:rmvirtualenv 虛擬環境名)
在CentOS的python虛擬環境中下載這些依賴包:pip install -r requirements.txt

可能會出現的錯誤

錯誤一:
出現Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*解決辦法
    解決:easy_install -U setuptools

錯誤二:
    安裝mysqlclient時可能會出錯,顯示OSError: mysql_config not found,mysql_config 找不到,
    所以導致mysqlclient安裝不上,centos需要再安裝下面這些依賴就可以有mysql_config了.
    解決:yum install mysql-devel gcc gcc-devel python-devel

安裝uwsgi

pip install uwsgi

建立配置檔案

將Windows中的專案檔案通過winscp上傳到Linux中,這裡將專案檔案直接放到root目錄下,然後在 /root/Django_blogs/  目錄下新建一個資料夾conf, Django_blogs是我的專案檔案。

在conf中建立uwsgi的配置檔案:

[uwsgi]

chdir           = /root/Django_blogs  # 專案路徑

module          = Django_blogs.wsgi

master          = true

processes       = 5

socket          = 127.0.0.1:8000

vacuum          = true

virtualenv = /root/.virtualenvs/blog_py3  #虛擬環境地址

 在conf下新建nginx的配置檔案:

upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server

server {
    listen      80;
    server_name 47.107.**.222 www.rongdang.top ; # 你的IP地址和備案後的域名
    charset     utf-8;

    client_max_body_size 75M;   # adjust to taste

    location /media  {
        alias /root/Django_blogs/media/;  # 指向django的media目錄
    }

    location /static {
        alias /root/Django_blogs/blog/static/; # 指向django的static目錄
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     uwsgi_params; # the uwsgi_params file you installed
    }
}

對專案進行更改

settings.py

DEBUG = False

ALLOWED_HOSTS = ['*']

# 靜態檔案路徑
STATIC_URL = '/static/'
STATIC_ROOT = (os.path.join(BASE_DIR, 'blog/static'))

# 媒體檔案路徑
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Djnago_blogs/urls.py

from django.views.static import serve
from untitled2.settings import STATIC_ROOT, MEDIA_ROOT

urlpatterns = [
    # 靜態檔案和媒體檔案訪問處理函式,如果不新增,在生產環境下則無法訪問靜態檔案和媒體檔案
    re_path(r'^static/(?P<path>.*)/$', serve, {'document_root': STATIC_ROOT}),
    re_path(r'^media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT})
]

在url.py檔案中一定要新增靜態檔案和媒體檔案訪問處理函式,如果不新增的話,執行專案時,即使你的路徑是正確的也載入不出對應的靜態檔案。

將nginx配置檔案新增到nginx的啟動配置檔案中

ln -s /root/Django_blogs/conf/my_nginx.conf /etc/nginx/conf.d/

如果nignx下沒有 conf.d 資料夾則新增一個就是了。

cd到專案路徑,蒐集所有的靜態檔案到static下,包括admin中的。

python manage.py collectstatic

最後通過Navicat,將Windows資料庫中的資料傳輸到阿里雲伺服器的資料庫中(點選工具-->資料傳輸)

settings.py中的資料庫連線也需要修改,因為密碼不一樣了。


修改nginx使用者為root使用者: vim /etc/nginx/nginx.conf 修改第一行使用者為root使用者,然後 pkill -f nginx 關閉nginx,nginx 啟動nginx

最後啟動uwsgi就可以通過域名看到我們的網站了。最後加 & 代表後臺執行

uwsgi -i /root/Django_blogs/conf/uwsgi.ini &

關於使用uwsgi測試執行

可以使用uwsgi的http協議訪問自己django寫的網站,例如:
    uwsgi --http :8000 --chdir /root/mysite --home /root/mysite_env --module mysite.wsgi:application

    /root/mysite  --> 指定專案所在路徑, /root/mysite_env --> 指定專案的虛擬環境 ,這裡mysite為我們的專案名
    注意:如果是在系統環境中執行該程式碼,系統環境中要有專案所有的python包,這裡我是進入虛擬環境中執行。

這樣測試執行的話靜態檔案什麼的應該是找不到的,例如我的 1.jpg 圖片在 /static/img 下,通過上面一段程式碼執行則顯示出來的圖片路徑在 /static/css/img/1.jpg  但是不用關心,只要程式能執行就行,然後我們通過 uwsgi -i /root/Django_blogs/conf/uwsgi.ini

執行專案後,那些問題就不會存在了,路徑也能訪問正確。


參考:https://blog.csdn.net/geerniya/article/list/3, 這位博主的文章給我提供了很大幫助