概述
最近学习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,具体参照这篇文章。