Linux服务器上部署Django博客应用的踩坑记录

概述

最近学习Django,查找资料的过程中发现了一个相当不错的教程,跟着敲下来之后,准备部署到虚拟机上。教程里的部署环境为CentOS 7(64 位), 而本人使用的是Ubuntu18.10。虽然流程是一样的,但是难免遇到各种问题,在此稍做记录。

遇到的问题

⭐python3安装

0.全新的服务器先改apt源

1.安装依赖(略)

2.下载源码

$ sudo apt install https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

3.解压

$ tar -zxvf Python-3.7.3.tgz

4.编译

$ cd Python-3.7.3

$  ./configure LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"

5.执行安装

$ make LD_RUN_PATH=/usr/local/lib

$ make install

如果这一步安装失败,可能是缺少某种依赖,根据报错安装依赖即可。

6.检查版本

$ python3 -V
Python 3.7.3

$ pip3 -V
pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

问题

$ sudo pip3.7 install pipenv 
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

以为是Openssl的安装出了问题,进入Python交互环境,输入import ssl检查,出现报错提示ImportError: No module named ssl。卸载后重新安装,还是报错。

解决

python找不到Openssl的安装目录,需要修改路径。具体参照这篇文章。

1.重新安装Openssl

$ cd /tmp
$ wget http://www.openssl.org/source/openssl-1.0.2e.tar.gz
$ tar xzvf openssl-1.0.2e.tar.gz
$ cd openssl-1.0.2e
$ ./config --prefix=/usr/local/openssl --openssldir=/usr/local/
$ make && make install

注意用参数指定安装目录--openssldir=/usr/local/>

2.修改python3.7.3/Moudels/Serup.dist

_socket socketmodule.c

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/openssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

修改为指定的目录SSL=/usr/local/opensslmei

3.重新编译python

4.检查import ssl,没有报错,Openssl安装成功

5.重新install pipenv,可以看到这次成功了

$ sudo pip3.7 install pipenv
···
Successfully installed pipenv-2018.11.26 virtualenv-16.4.3 virtualenv-clone-0.5.3

⭐Pipfile not found

问题

服务器上安装项目依赖时报错,找不到pipfile

$ pipenv install --deploy --ignore-pipfile 
Error:Pipfile not found

解决

在开发环境中,pycharm默认新项目处在一个虚拟环境中,自带virtualenv ,如果没有另外安装pipenv,自然不存在pipfile文件,所以在部署到服务器上时则会报错。
使用以下命令初始化pipenv项目,再导入环境依赖(当然最好是一开始就装了pipenv)。

$ pipenv --python python3.7
$ pipenv install Django, Markdown

以前的版本中,如果没有Pipfile,则在执行pipenv install时会自动创建一个。但是,在python3.7之后不适用。

⭐Nginx duplicate default server error

问题

为项目新建nginx配置文件后,输入sudo systemctl restart nginx命令重启nginx服务器却报错,根据提示输入systemctl status nginx.service命令,查看详细情况,其中报错如下。

systemd[1]: Starting A high performance web server and a reverse proxy server...
nginx[1439]: nginx: [emerg] "location" directive is not allowed here in /etc/nginx/nginx.conf:87
nginx[1439]: nginx: configuration file /etc/nginx/nginx.conf test failed
systemd[1]: nginx.service: Control process exited, code=exited status=1
systemd[1]: Failed to start A high performance web server and a reverse proxy server.
systemd[1]: nginx.service: Unit entered failed 
systemd[1]: nginx.service: Failed with result 'exit-code'.
systemd[1]: Stopped A high performance web server and a reverse proxy server.

解决

此问题是由重复default_server提供一个或多个指令的参数给listen文件引起的。需要删除/etc/nginx/sites-enabled的默认配置,具体参照这篇文章。

$ sudo rm /etc/nginx/sites-enabled/default.conf

⭐Gunicorn server start error

问题

执行Gunicorn 启动服务时,pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000报错。

[19640] [INFO] Starting gunicorn 19.4.5
[19640] [ERROR] Connection in use: ('0.0.0.0', 8000)
[19640] [ERROR] Retrying in 1 second.
[19640] [ERROR] Connection in use: ('0.0.0.0', 8000)
[19640] [ERROR] Retrying in 1 second.
[19640] [ERROR] Connection in use: ('0.0.0.0', 8000)
[19640] [ERROR] Retrying in 1 second.
[19640] [ERROR] Connection in use: ('0.0.0.0', 8000)
[19640] [ERROR] Retrying in 1 second.
[19640] [ERROR] Can't connect to ('0.0.0.0', 8000)

解决

Connection in use: ('0.0.0.0', 8000)表示该端口正在使用中,需要找到当前正在使用该端口的进程将其关闭。

$ sudo fuser -k 8000/tcp
$ kill -9 进程号

⭐Nginx找不到静态文件

问题

经过一番折腾后访问部署成功的网站,发现页面的样式乱套了,F12进入控制台,显示找不到js、css等文件。
检查文件路径/home/user/apps/DjangoProject/static/,与nginx的配置文件一致。

server {
    charset utf-8;
    listen 80;
    server_name 123.com;
 
    location /static {
        alias /home/user/apps/DjangoProject/static;
    }
  ···
}

查看网页源代码,点击文件路径跳转如下页面,看来是nginx的问题。

404 not found
nginx/1.15.5

解决

打开nginx的配置文件,增加如下代码。

location ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
        root /home/kzl/data/app/;
    }

这个location说明如果你要访问js,css,png···结尾的文件,你需要在你的访问路径前加上root,具体参照这篇文章。

你可能感兴趣的:(Linux服务器上部署Django博客应用的踩坑记录)