Django項目部署避坑指南(一)

前言

這篇文章主要是要寫一下我在將Django項目部署到阿里雲服務器上時遇到的一些坑,將它們分享出來,希望遇到相同問題的人可以參考着解決。需要注意這不是部署教程,這裏並不會教你如何部署,更不會教你如何使用Django搭建網站,這些內容可以很容易的在網上找到。

unable to resolve host

這個報錯在Ubuntu16.04上出現過,後來我係統換成CentOS了。

解決辦法是使用sudo vi /etc/hosts命令,編輯一下這個文件,在
127.0.0.1 localhost這一行後面加上你自己的機器名稱就好了。

settings.py

擁有云服務器後,可以通過一些工具將本地文件直接上傳,由於我把代碼放到GitHub上了,所以有一些在settings.py中的敏感信息,例如mysql的密碼,可以放到Bash變量裏或者文件裏,不要顯式的放在開源文件中,或者建個私密GitHub倉庫也行。

with open('env.json') as env:
    ENV = json.load(env)

SECRET_KEY = ENV['SECRET_KEY']

if ENV.get('ENV') == 'dev':
    DEBUG = True
else:
    DEBUG = False

例如上面這樣。

注意,如果你建了env.json這樣一個文件,可要記得在.gitignore裏把它忽略掉,要不然上傳到GitHub那可就沙雕了。即使你不開放源代碼,Django也推薦最好是把SECRET_KEY放到系統環境變量裏。

另外,在生產環境(服務器)上,DEBUG這個選項要設成False,還有ALLOWED_HOSTS:

ALLOWED_HOSTS = ['.elliot00.com', '127.0.0.1', 'localhost']

不建議用通配符*來配置。當DEBUG被設成False這個列表就必須配置,否則要報錯。

ALLOWED_HOSTS是一個字符串列表,代表了這個Django網站可以服務的主機名或域名。這是爲了阻止HTTP Host頭攻擊而採用的一種安全措施,這種攻擊即使在很多看上去很安全的服務器配置下依然能夠成功。

CentOS使用Mysql

開發服務器用的是sqlite,在生產環境換成Mysql。如果你的雲服務器系統選的是CentOS,恭喜你中獎了,多了一些學(zhua)習(kuang)的機會。
下面是安裝命令:

& sudo cd /usr/local/src/
& sudo wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm 
& sudo rpm -ivh mysql57-community-release-el7-8.noarch.rpm 
& sudo yum -y install mysql-server 
我用&符號表示Linux命令行的提示符,注意別把它輸進去了。

接着更改一下配置,sudo vi /etc/my.cnf,修改下面這一塊。

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id = 1
expire_logs_days = 3

OK,接下來sudo service mysqld restart重啓一下,使用mysql -u root -p就可以使用啦(纔怪),在Debian繫系統使用apt裝個MySQL同學會發現,安裝的時候咋沒讓我設置密碼啊,對沒錯,安裝後第一次登陸密碼是隨機的……
隨便瞎輸個密碼,報錯,然後**grep "password" /var/log/mysqld.log**
把密碼輸出來,用這個隨機密碼登錄一下,接着按下面步驟操作:

mysql> alter user 'root'@'localhost' identified by '你的新密碼';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database MyBlog character set utf8;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| MyBlog             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye

重置了密碼,並且新建了一個和我Django項目同名的表。

PyMysql

這是個十分奇怪的bug,我至今沒找到原因。

我分別在Windows10Kali Linux 2019CentOS 7.3Ubuntu 16.04Manjaro 18.1.0上用pip3都只能安裝pymysql 0.9.3版本。這樣你的Django項目一運行就會報錯。目前我找到的解決辦法有兩個:

  • 退回去使用Django2.1版本
  • 找到你的django/db/backends/mysql/base.py文件,把裏面關於版本報錯的兩行註釋掉。
#if version < (1, 3, 13):
#    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
沒仔細看報錯信息,突然發現,Python還有個mysqlclient庫,難怪我查到的pymysql最新版本就是0.9.3啊……改用這個庫也是可以的

掃碼關注:
二維碼.jpg

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