使用Centos7.5+Nginx+Gunicorn+Django+Python3部署blog項目

項目開發環境是 Python3.5.2+Django1.10.6+Sqlite3+Centos7.5+Nginx1.12.2+Gunicornphp

發佈出來供須要的同窗借鑑參考。文中若有錯誤請多多指正!html

轉載請註明出處!https://blog.markhoo.comnode

部署前的準備python

服務器

要部署項目就要先購買服務器,如騰訊雲,阿里雲等等mysql

注意:服務器在國內的話,必需要備案!否則沒法使用。nginx

阿里雲優惠券:點擊前往領取
騰訊雲代金券:點擊前往領取
騰訊雲首頁:點擊直達
騰訊雲西南區雲產品促銷連接:點擊直達
騰訊雲服務器購買連接:點擊直達git

域名

域名購買選擇,能夠到百度雲,騰訊雲,阿里雲,GoDaddy,namecheap等等github

購買域名後就是解析域名,打開域名解析面板,添加解析記錄
記錄類型:A
主機記錄:test.markhoo.com,這個markhoo.com是你的一級域名,二級域名你能夠設置爲www.markhoo.com
解析線路:能夠默認也能夠選別的
記錄值:填寫你的服務器IP地址
TTL:域名生效時間,也就是多久生效
設置好以上內容,點擊肯定。解析完成sql

主機記錄中這個markhoo.com是你的一級域名,二級域名你也能夠設置爲 www.markhoo.com 或者別的 xxx.markhoo.com 也能夠。
注意:域名是否在國內購買不重要,只要服務器不在大陸購買,即便未備案照樣可使用。要是要解析的服務器是大陸服務商則必需要備案。備案後一個域名能夠同時接入多個服務商。shell

域名解析記錄類型說明:
- A:將域名指向一個IPv4地址
- AAAA:將域名指向一個IPv6地址
- CNAME:將域名指向另一個域名
- NS:將子域名指定其餘DNS服務器解析
- MX:將域名指向郵件服務器地址
- SRV:記錄提供特定的服務的服務器
- TXT:文本長度限制512,一般作SPF記錄(反垃圾郵件)
- CAA:CA證書頒發機構受權校驗
- 顯性URL:將域名302重定向到另一個地址
- 隱性URL:與顯性URL相似,可是會隱藏真實目標地址

xshell下載與安裝

主要用於遠程登陸服務器進行相關操做。在官網註冊後發送下載連接到你的註冊郵箱,或者到搜索引擎搜索下載。
我的版免費,企業版收費。
下載後一路點擊下一步,完成。

登陸服務器步驟:
點擊左上角'文件'--'新建'
而後彈出對話框
常規:名稱,這個你能夠隨便取什麼名字
協議:SSH,通常默認
主機:空,填上你的服務器IP地址
端口號:22,默認的就行
填好以上選項內容,點擊左側的'用戶身份驗證',而後看右側,方法選擇'Password',在下面輸入你的服務器登陸用戶名和密碼,最後點擊下面的'鏈接'。
登陸成功!進入界面。

百度網盤官網軟件下載連接:
連接: https://pan.baidu.com/s/19K5q1JkmD9qnYaGRTALyLg 密碼: r6hx

安裝Nginx

首先用xshell登陸服務器
經過 yum 安裝 Nginx

> yum install nginx

啓動 Nginx 服務

> systemctl start nginx

或者

> systemctl start nginx.service
> systemctl enable nginx.service

訪問服務器IP地址,能夠看到 nginx 的歡迎界面

Nginx相關命令:
中止nginx

> nginx -s stop

重啓nginx

> nginx -s reload

Centos7.5安裝Python3

因爲centos7.5本來默認安裝了Python2,並且這個Python2不能被刪除,由於有不少系統命令,好比yum都要用到。
如下操做首先要用xshell登陸到服務器
輸入Python命令,查看能夠得知是Python2.7.5版本

輸入

> which python

能夠查看位置,通常是位於/usr/bin/python目錄下。

下面介紹安裝Python3的方法

首先安裝依賴包

> yum -y groupinstall "Development tools"
> yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

而後根據本身需求下載不一樣版本的Python3,我下載的是Python3.5.2

注:若是速度不夠快,能夠直接去官網下載,利用WinSCP等軟件傳到服務器上指定位置。

個人存放目錄是/usr/local/python3,使用命令:

> mkdir /usr/local/python3

創建好一個空文件夾,進入該目錄

> cd /usr/local/python3

使用一下命令下載壓縮包

> wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz

而後解壓壓縮包安裝Python3

> tar -xvJf Python-3.5.2.tar.xz
> cd Python-3.5.2
> ./configure --prefix=/usr/local/python3
> make && make install

最後建立軟連接

> ln -s /usr/local/python3/bin/python3 /usr/bin/python3
> ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

在命令行中輸入python3測試

升級pip3命令:

> pip3 install --upgrade pip

部署前的項目配置

Django 項目中會有一些 CSS、JavaScript 等靜態文件,爲了可以方便地讓 Nginx 處理這些靜態文件的請求,咱們把項目中的所有靜態文件收集到一個統一的目錄下,這個目錄一般位於 Django 項目的根目錄,而且命名爲 static。爲了完成這些任務,須要在項目的配置文件裏作一些必要的配置:

myblog/settings.py

# 其餘配置...

STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

STATIC_ROOT 指明瞭靜態文件的收集目錄,即項目根目錄(BASE_DIR)下的 static 文件夾。

爲了安全起見,在生產環境下須要關閉 DEBUG 選項以及設置容許訪問的域名。打開 settings.py 文件,找到 DEBUG 和 ALLOWED_HOSTS 這兩個選項,將它們設置成以下的值:

myblog/settings.py

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.markhoo.com']

ALLOWED_HOSTS 是容許訪問的域名列表,127.0.0.1 和 localhost 是本地訪問的域名,.markhoo.com 是訪問服務器的域名(換成你本身的域名)。域名前加一個點表示容許訪問該域名下的子域名,好比 www.markhoo.com test.markhoo.com 等二級域名一樣容許訪問。若是不加前面的點則只容許訪問 markhoo.com。

項目還會依賴一些第三方 Python 庫,爲了方便在服務器上一次性安裝,咱們將所有依賴寫入一個叫 requirements.txt 的文本文件中。激活本地的虛擬環境(若是你使用了虛擬環境的話),並進入項目的根目錄,運行 pip freeze > requirements.txt 命令:

> (myblog_env) D:\Djangoprojects\myblog>
> pip freeze > requirements.txt

這時項目根目錄下會生成了一個 requirements.txt 的文本文件,其內容記錄了項目的所有依賴。因爲有一些依賴包也有前後依賴關係,該調整的須要進去txt文件調整一下。

若是上傳到服務器後修改,可使用 'vi (文件名稱)' 打開文件,而後點擊鍵盤 'i' 鍵切換到輸入模式。
修改完須要退出,先按鍵盤 'Esc' 鍵,而後輸入 ':wq' 保存退出。若是不想修改又沒法退出能夠用 ':q!' 強制退出,這樣不會保存你修改的內容
更多的vi、vim命令使用方法能夠自行到搜索引擎搜索學習,這裏就不一一講解了。

將代碼上傳到 GitHub 、 Gitee 、 或者Coding

將代碼上傳到 GitHub 等代碼託管平臺,這樣咱們就能夠方便地把代碼拉取到服務器了。
若是訪問慢或者打不開GitHub的話,能夠上傳到國內的Gitee或者Coding

Git的安裝和上傳代碼的簡單方法

安裝Git能夠到官網 https://git-scm.com 下載,安裝的話能夠一直下一步,完成。

首先你須要一個GitHub 、 Gitee 、 或者Coding帳號,因此尚未的話先去註冊吧!

https://github.com
https://gitee.com
https://coding.net

1.進入Github首頁,點擊New repository新建一個項目

2.填寫相應信息後點擊create便可

Repository name: 倉庫名稱

Description(可選): 倉庫描述介紹

Public, Private : 倉庫權限(公開共享,私有或指定合做者)

Initialize this repository with a README: 添加一個README.md

gitignore: 不須要進行版本管理的倉庫類型,對應生成文件.gitignore

license: 證書類型,對應生成文件LICENSE

通常能夠填寫項目倉庫名稱,點擊create就能夠了。由於免費用戶只有 Gitee 才能夠建立私有倉庫

3.建立好項目倉庫後,在項目倉庫頁面點擊Clone or dowload會出現一個地址,copy這個地址備用。

4.接下來就到本地操做了,首先右鍵你的項目,若是你以前安裝git成功的話,右鍵會出現兩個新選項,分別爲Git Gui Here,Git Bash Here,這裏咱們選擇Git Bash Here進入界面,個人本地項目名爲myblog。

5.接下來輸入以下代碼(關鍵步驟),把github上面的倉庫克隆到本地

> git clone (粘貼上你以前複製的地址)

6.操做步驟5之後你的本地項目文件夾下面就會多出個文件夾,該文件夾名即爲你github上面的項目名,如我多出了個myblogsite文件夾,咱們把本地項目文件夾下的全部文件(除了新多出的那個文件夾不用),其他都複製到那個新多出的文件夾下。

7.接着繼續輸入命令 cd myblogsite,進入myblogsite文件夾

8.接下來依次輸入如下代碼便可完成其餘剩餘操做:

> git add . (注:別忘記後面的.,此操做是把myblogsite文件夾下面的文件都添加進來)
> git commit -m "提交信息" (注:「提交信息」裏面換成你須要,如「first commit」)
> git push -u origin master (注:此操做目的是把本地倉庫push到github上面,此步驟須要你輸入GitHub賬號和密碼)

注意:數據庫文件不要上傳!要是SQLLITE3裏面有你測試的重要數據,將可能會泄露。

設置服務器目錄結構

接下來須要把代碼上傳到服務器了。我服務器上存放代碼的目錄結構通常是這樣的:

/home/markhoo/
sites/
markhoo.com/
myblog_env/
myblog/

一臺服務器可能部署多個網站,全部網站代碼都放在 sites/ 目錄下。markhoo.com/ 這個文件夾以網站的域名命名,便於區分。myblog_env 是 python 虛擬環境目錄。myblog 是 Django 博客項目目錄。
建立這個目錄結構,注意目錄名替換爲你本身的域名,之後涉及到 markhoo.com 的地方一般都要替換你本身的域名,後面就再也不一一指出了。
備註:上面的個人目錄結構.可能會有新手看不懂,解釋一下,就像下面這樣一直建立下去

/home/markhoo/sites/markhoo.com/

最後的 myblog_env 和 myblog 是同級目錄位於markhoo.com下,這裏本身先不要建立。

建立目錄的命令爲: mkdir (文件夾名稱)
刪除目錄的命令爲: rmdir (文件夾名稱)

安裝virtualenv

爲了避免影響外界環境的清潔,因此咱們使用虛擬環境來配置 Django 項目
首先用xshell登陸到你的服務器,而後按一下步驟操做

> pip3 install virtualenv

接下來建立虛擬環境,先進入到 markhoo.com 目錄下,而後運行 virtualenv 命令建立虛擬環境:

> [root@instance-pkb22o0h]# cd /home/markhoo/sites/markhoo.com
> [root@instance-pkb22o0h markhoo.com]# virtualenv -p /usr/bin/python3 –-no-site-packages myblog_env

命令說明:
-p: 指定你要虛擬的Python版本,這裏選擇了本地的python3
–-no-site-packages:表示在創建虛擬環境時不將原版本中的第三方庫拷貝過來,這樣就能得到一個純淨的Python環境。
myblog_env:代表在該目錄下,創建一個叫作myblog_env的虛擬環境,這樣的命名方式,讓你一眼就能看出這個虛擬環境是爲誰創建的。

virtualenv的命令使用方法:
建立虛擬環境: 

$ virtualenv -p /usr/bin/python3.5 –-no-site-packages myblog_env

啓動虛擬環境: 

$ source myblog_env/bin/activate 

退出虛擬環境:

 $ deactivate 

刪除虛擬環境: 

$ rm –r myblog_env

檢查一下虛擬環境是否建立成功,運行 ls 命令列出當前目錄下的文件和文件夾,看到 myblog_env 這個文件夾說明虛擬環境建立成功。

> [root@instance-pkb22o0h markhoo.com]# ls
> myblog_env

venv的使用

因爲我只是測試項目,因此使用了Python自帶的venv。
先進入到 markhoo.com 目錄下,而後運行 python3 -m venv myblog_env 建立虛擬環境:

> [root@instance-pkb22o0h]# cd /home/markhoo/sites/markhoo.com
> [root@instance-pkb22o0h markhoo.com]# python3 -m venv myblog_env

檢查一下虛擬環境是否建立成功,運行 ls 命令列出當前目錄下的文件和文件夾,看到 myblog_env 這個文件夾說明虛擬環境建立成功。

> [root@instance-pkb22o0h markhoo.com]# ls
> myblog_env

在虛擬環境中安裝 django 以及依賴包並初始化項目

接着再從代碼倉庫把項目代碼拉取過來,把 git clone 後的地址換成你本身的 GitHub 倉庫地址!

> [root@instance-pkb22o0h markhoo.com]# git clone https://github.com/MarkHoo/myblog.git

運行 ls 命令檢查一下是否拉取成功:

> [root@instance-pkb22o0h markhoo.com]# ls
> myblog myblog_env

多了 myblog 文件夾(文件夾名稱由你的 GitHub 倉庫名決定),說明拉取成功了。

接下來執行命令,啓動虛擬環境

> [root@instance-pkb22o0h markhoo.com]# source myblog_env/bin/activate
> (myblog_env) [root@instance-pkb22o0h markhoo.com]#

安裝項目環境依賴

> (myblog_env) [root@instance-pkb22o0h markhoo.com]# cd myblog
> (myblog_env) [root@instance-pkb22o0h myblog]# pip3 install -r requirements.txt

收集靜態文件
運行 python manage.py collectstatic 命令收集靜態文件到 static 目錄下

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py collectstatic

生成數據庫

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py migrate

建立超級用戶

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py createsuperuser

而後就會出現如下內容,第一個是用戶名,第二個是郵箱,第三和第四是密碼(輸入時沒有任何顯示,實際上已經輸入了)。最後顯示建立成功!

> Username (leave blank to use 'root'): admin
> Email address: admin@markhoo.com
> Password: 
> Password (again): 
> Superuser created successfully.

備註:這裏使用的是Django默認生成的sqlite3數據庫,我使用了這個,簡單寫寫博客夠用了。

啓動 Django

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py runserver 0.0.0.0:8000

若是沒有報錯,就說明 Django 已經安裝成功了,打開瀏覽器輸入你的服務器IP:8000,就能夠看到你的網站了

退出 Django

按 ctrl+c 退出 Django 服務

安裝 Mysql (使用MySQL數據庫同窗能夠借鑑)

安裝並啓動 mariadb

由於 CentOS 7 以後的版本都不在提供 Mysql 安裝源,這裏咱們使用 mariadb 代替 mysql,依次執行下列命令

> yum install mariadb mariadb-server -y
> yum install MySQL-python -y
> systemctl start mariadb

對 mariadb 進行初始化設置

- 執行下面命令,根據提示操做
- 設置新密碼爲 test
- 默認密碼爲空,直接回車便可

> mysql_secure_installation

使用設置的密碼登錄 mariadb
- 登錄 db,這裏假設密碼被設置爲 admin123

> mysql -uroot -ptest

建立一個數據庫

> create database myblog;

成功後,輸入 exit 命令退出 db

> exit

修改配置文件,與 Mysql 數據庫相關聯
編輯 myblog/settings.py

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myblog',
'PASSWORD':'admin123',
'USER': 'root',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}

建立 Django 數據庫

> (myblog_env) [root@instance-pkb22o0h myblog]# cd /home/markhoo/sites/markhoo.com/myblog
> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py migrate

建立超級用戶

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py createsuperuser

而後就會出現如下內容,第一個是用戶名,第二個是郵箱,第三和第四是密碼(輸入時沒有任何顯示,實際上已經輸入了)。最後顯示建立成功!

> Username (leave blank to use 'root'): admin
> Email address: admin@markhoo.com
> Password: 
> Password (again): 
> Superuser created successfully.

啓動 Django

> (myblog_env) [root@instance-pkb22o0h myblog]# python manage.py runserver 0.0.0.0:8000

若是沒有報錯,就說明 Django 已經安裝成功了,而且跟 Mysql 的鏈接正常。打開瀏覽器輸入你的服務器IP:8000,就能夠看到你的網站了

退出 Django

按 ctrl+c 退出 Django 服務

使用 Gunicorn

Gunicorn 通常用來管理多個進程,有進程掛了Gunicorn 能夠把它拉起來,防止服務器長時間中止服務,還能夠動態調整 worker 的數量,請求多的時候增長 worker 的數量,請求少的時候減小。

在虛擬環境下,安裝 Gunicorn:

> (myblog_env) [root@instance-pkb22o0h myblog]# pip3 install gunicorn

測試Gunicorn是否能啓動你的項目服務

> (myblog_env) [root@instance-pkb22o0h myblog]# gunicorn --bind 0.0.0.0:8000 myblog.wsgi:application

注意:myblog.wsgi:application這裏的myblog對應的是 /home/markhoo/sites/markhoo.com/myblog/myblog, 根據本身的修改。瀏覽器輸入域名,能夠看到訪問成功了!

訪問ip地址看瀏覽器是否能正常查看內容(此時沒有退出虛擬環境)
完成測試後,按CTRL-C 中止 Gunicorn 運行

退出虛擬環境

> deactivate

建立一個 Gunicorn Systemd Service 文件,直接運行如下命令

> vim /etc/systemd/system/gunicorn.service

修改內容以下:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=nginx
WorkingDirectory=/home/markhoo/sites/markhoo.com/myblog
ExecStart=/home/markhoo/sites/markhoo.com/myblog_env/bin/gunicorn --workers 3 --bind unix:/home/markhoo/sites/markhoo.com/myblog/myblog.sock myblog.wsgi:application

[Install]
WantedBy=multi-user.target

 

必定要注意本身的項目路徑和虛擬環境路徑
WorkingDirectory與ExecStart 修改成本身的路徑

開啓Gunicorn服務並開機自啓,運行如下命令

> systemctl start gunicorn
> systemctl enable gunicorn

配置 Nginx

接下是配置 Nginx 來處理用戶請求

配置nginx代理經過Gunicorn
依次運行如下命令

> (myblog_env) [root@instance-pkb22o0h myblog]# cd /etc/nginx/
> (myblog_env) [root@instance-pkb22o0h nginx]# ls
> conf.d fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf scgi_params uwsgi
> default.d fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi
> (myblog_env) [root@instance-pkb22o0h nginx]# vi nginx.conf

或者直接運行

> vim /etc/nginx/nginx.conf

打開後默認的內容以下:

# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

}

找到server內容進行修改,具體內容以下:

server {
listen 80;
server_name markhoo.com 0.0.0.0;

location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/markhoo/sites/markhoo.com/myblog;
}

location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/markhoo/sites/markhoo.com/myblog/myblog.sock;
}

}

注意修改本身的IP地址或域名,還有文件路徑
server_domain_or_IP 表明你的IP地址或域名

- 這裏的域名爲 markhoo.com,其次必定要添加 0.0.0.0 不然沒法訪問,兩個之間用空格隔開。
- 全部URL 帶有 /static 的請求均由 Nginx 處理,alias 指明瞭靜態文件的存放目錄。
- 其它請求轉發給 Django 處理。proxy_pass 後面使用了 unix 套接字,其做用是防止端口衝突,這裏就再也不詳述。

修改所涉及到的vim命令使用方法:使用 'vi (文件名稱)' 是打開文件,而後點擊鍵盤 'i' 鍵切換到輸入模式。修改完須要退出vim編輯器,先按鍵盤 'Esc' 鍵,而後輸入 ':wq' 保存退出。若是不想修改又沒法退出能夠用 ':q!' 強制退出,這樣不會保存你修改的內容。
更多的vi、vim命令的具體使用方法能夠自行到搜索引擎搜索學習,這裏也不一一講解了。

修改nginx的權限

> usermod -a -G root nginx
> chmod 710 /home/
> nginx -t

若是沒有報錯,就行下一步操做

開啓nginx服務並開機自啓

> systemctl start nginx
> systemctl enable nginx

如今,一切配置完成!你能夠訪問你的域名了!

相關文章
相關標籤/搜索