前言
這篇文章主要是要寫一下我在將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,我至今沒找到原因。
我分別在Windows10
、Kali Linux 2019
、CentOS 7.3
、Ubuntu 16.04
、Manjaro 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啊……改用這個庫也是可以的
掃碼關注: