Nginx+Gunicorn+Supervisor 部署 Django 博客应用

2019-09-1336028 阅读101 评论

博客的基础功能已经开发的差不多了,虽然还有很多地方可以完善,但我们还是希望早点把博客部署到服务器上,让他人可以通过外网访问。至于有待完善的地方,可以等部署完后一点点地迭代和改进。现在就让我们来把博客部署到服务器上吧!

注意:本文的每一个步骤都在真实环境下验证无误。除非你知道自己在做什么,否则建议每一步均严格按照教程的指导来,这样能保证你顺利完成部署。

部署不成功???看这里!

作者亲自录制的部署视频,真机环境演示部署全过程,再不成功你打我。

b站(阿里云,CentOS 7):戳这里

youtube(阿里云,CentOS 7):龟速上传中

b站(Ubuntu 18):敬请期待

youtube(Ubuntu 18):敬请期待

部署前准备

我们将使用比较流行的 Nginx + Gunicorn 的方式将 django 开发的博客部署到自己的服务器,让别人能够通过域名访问你的博客。至于 Nginx、Gunicorn 是什么暂时放到一边,读完本教程后你就会知道它们的作用和使用方法了。

为了部署我们的博客,需要满足以下两个条件:

  1. 最好有一台可以通过外网访问的服务器(如果没有的话可以在自己的电脑上建一台虚拟机,通过虚拟 ip 访问)。
  2. 最好有一个域名(如果没有的话,则只能使用 ip 访问,且不能开启 HTTPS)。

配置服务器

本教程使用的本地环境为 Windows 10,服务器环境为 CentOS 7(64 位)。如果你的环境和我的有所差异(比如 Ubuntu)导致一些命令无法执行,将这些命令转换为你所在环境的命令执行即可,重点在于理解每一步的作用,这样无论在何种环境你都能成功地完成部署,而不是机械地复制粘贴命令。

### 远程登录到服务器

服务器通常位于云端,需要使用远程登录工具登录后才能对服务器进行操作。我使用的是 Xshell,Windows 下百度 Xshell 下载安装即可,软件对学校和个人用户是免费的。

如何远程登录到服务器这里就不赘述了,相信你参考网上的一些教程肯定能够顺利登录。假如你和我一样使用 Xshell 的话,这里有一篇很详细的教程可以参考:教你怎么使用xshell远程连接linux服务器

创建一个超级用户

顺利连接到远程服务器了,如果是一台全新服务器的话,通常我们是以 root 用户登录的。在 root 下部署代码不够安全,最好是建一个新用户(如果你已经以非 root 用户登录的话可以跳过这一步)。下面的一些列命令将创建一个拥有超级权限的新用户(把 yangxg 替换成你自己想要的用户名,我这里取我的名字拼音 yangxg):

# 在 root 用户下运行这条命令创建一个新用户,yangxg 是用户名
# 因为我叫杨学光,所以我取的用户名是 yangxg
# 选择一个你喜欢的用户名,不一定非得和我的相同
root@server:~# adduser yangxg

# 为新用户设置密码
# 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可
root@server:~# passwd yangxg

# 把新创建的用户加入超级权限组
root@server:~# usermod -aG wheel yangxg

# 切换到创建的新用户
root@server:~# su - yangxg

# 切换成功,@符号前面已经是新用户名而不是 root 了
yangxg@server:$

新用户创建并切换成功了。如果是新服务器的话,最好先更新一下系统,避免因为版本太旧而给后面安装软件带来麻烦。运行下面的两条命令:

yangxg@server:$ sudo yum update
yangxg@server:$ sudo yum upgrade

更新 SQLite3

为了方便,我们博客使用了 SQLite3 数据库,django 2.2 要求 SQLite3 数据库版本在 3.8.3 以上,而 CentOS 7 系统自带版本低于 django 2.2 所要求的最低版本,所以首先来更新 SQLite3 的版本。

注意

有可能你使用的服务器系统发行版 SQLite3 已经高于 3.8.3,这一步就可以跳过。如何查看 SQLite3 的版本呢?请执行 sqlite3 --version

首先登陆到 sqlite 的官方下载地址,查看最新发布的版本,截止到本教程完成时,其最新版本为 3.29.0,找到该版本的源码压缩包,复制其下载链接,然后通过 wget 命令下载到服务器(我一般习惯将源码放在 ~/src 目录下。)

# 创建 src 目录并进到这个目录
yangxg@server:$ mkdir -p ~/src
yangxg@server:$ cd ~/src

# 下载 sqlite3 源码并解压安装
yangxg@server:$ wget https://sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
yangxg@server:$ tar zxvf sqlite-autoconf-3290000.tar.gz
yangxg@server:$ cd sqlite-autoconf-3290000
yangxg@server:$ ./configure
yangxg@server:$ make
yangxg@server:$ sudo make install

小贴士:

如果 wget 命令不存在,使用 sudo yum install -y wget 安装即可。

至此 SQLite3 更新完毕,接下来安装 Python3。

安装 Python3 和 Pipenv

CentOS 7 自带的 Python 发行版为 2.7,因此需要安装 Python3,为了兼容性,我们安装 Python 3.6.4。

首先安装可能的依赖:

yangxg@server:$ sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

然后下载 Python 3.6.4 的源码并解压:

yangxg@server:$ cd ~/src
yangxg@server:$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
yangxg@server:$ tar -zxvf Python-3.6.4.tgz

最后编译安装:

yangxg@server:$ cd Python-3.6.4
yangxg@server:$ ./configure LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"
yangxg@server:$ make LD_RUN_PATH=/usr/local/lib
yangxg@server:$ sudo make install

注意这里安装 Python 时,Python 会依赖 SQLite3 的库,所以在 configure 时通过 LD_RUN_PATH 指定依赖的搜索目录(因为我们之前更新了 SQLite3 的版本,指定依赖搜索目录确保使用新的 SQLite3 依赖库),另外两个参数作用类似。

然后输入 python3.6 -V 和 pip3.6 -V 命令测试安装结果,输出版本号说明安装成功了。

有了 pip,就可以安装 Pipenv 了:

yangxg@server:$ sudo pip3.6 install pipenv

小贴士:

如果以上命令报错,可能是因为 pip3.6 安装在当前用户的 bin 路径下(/usr/local/bin/),使用 pip3.6 install pipenv --users 命令也把 Pipenv 安装到当前用户的 bin 路径下就可以了。

部署代码

接下来开始准备部署代码,让我们的博客应用在服务上跑起来,这和在本地开发时的过程是一模一样的。不过为了将应用部署到服务器上,我们首先要对项目做一点配置,打开 settings.py,找到 ALLOWED_HOSTS,将其修改为:

blogproject/settings.py

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

指定了 ALLOWED_HOSTS 的值后,django 将只允许通过指定的域名访问我们的应用,比如这里只允许通过 127.0.0.1,localhost 以及 zmrenwu.com 和其任意子域名(域名前加一个点表示允许访问该域名下的子域名)访问(即 HTTP 报文头部中 Host 的值必须是以上指定的域名,通常你在浏览器输入域名访问网站时,Host 的值就会被设置为网站的域名),这样可以避免 HTTP Host 头攻击。

django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于 django 项目的根目录,并且命名为 static。为了完成这些任务,需要在项目的配置文件里做一些必要的配置:

blogproject/settings.py

# 其他配置...

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

STATIC_ROOT 即指定静态文件的收集路径,这里指定为 BASE_DIR(项目根目录,在 settings.py 文件起始处定义)下的 static 文件夹。

现在的关键是把代码传到服务器上来了,这里我们使用 git。首先安装 git:

yangxg@server:$ sudo  yum install -y git

将代码上传到 GitHub 等代码托管平台,这样我们就可以方便地把代码拉取到服务器了。Git 和 GitHub 的使用相信你已经很熟悉了,这里就不赘述过程。如果不知道如何使用地话可以自行百度相关教程。注意数据库文件不要上传!

我通常喜欢把应用代码放在 ~/apps/ 目录下,先来设置一下服务器的文件结构,用于存放应用代码等相关文件:

# 在用户目录下创建 apps 目录并进入
yangxg@server:$ mkdir -p ~/apps
yangxg@server:$ cd ~/apps

# 拉取博客代码
yangxg@server:$ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git

然后进入到项目根目录,安装项目依赖:

yangxg@server:$ cd ~/apps/HelloDjango-blog-tutorial

yangxg@server:$ pipenv install --deploy --ignore-pipfile

这里指定 --deploy 参数,Pipenv 将只会安装 Pipfile 中 [packages] 下指定的依赖。因为我们现在是在线上环境进行部署,仅用于开发环境的相关依赖我们并不需要。

--ignore-pipfile 将会使 Pipenv 从 Pipfile.lock 文件中安装项目依赖。Pipfile.lock 记录了项目依赖的精确信息,从这里读取依赖信息能够确保依赖信息被无意中修改或者破坏而使得运行环境因为依赖包的缘故出现不可预料的问题。

Pipenv 会自动帮我们创建虚拟环境,然后将项目依赖安装到虚拟环境下。

然后创建一下数据库:

yangxg@server:$ pipenv run python manage.py migrate

启动开发服务器:

yangxg@server:$ pipenv run python manage.py runserver 0.0.0.0:8000

这里我们启动开发服务器时指定了服务器运行的 ip 和端口,这将允许通过公网 ip 的 8000 端口访问我们的博客。

访问 ip:8000,可以看到访问成功(其中 ip 为你服务器的公网 ip)。

使用 Gunicorn

django 官方文档强调使用 runserver 开启的开发服务器仅用于开发测试,不建议用于生产环境。所以我们使用流行的 Gunicorn 来启动可以用于线上环境的服务器。

首先进入到项目根目录,安装 Gunicorn:

yangxg@server:$ pipenv install gunicorn

由于我们在服务端修改安装了 gunicorn,代码中 Pipfile 文件和 Pipfile.lock 文件会被更新,因此别忘了把改动同步到本地,具体做法可以自行学习,以下是一个参考:

# 服务端提交代码
yangxg@server:$ git add Pipfile Pipfile.lock
yangxg@server:$ git commit -m "add gunicorn dependency"
yangxg@server:$ git push

# 本地拉取代码
git pull

回到线上服务器,在项目根目录,执行下面的命令启动服务:

yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000

来解释一下各个参数的含义。

`-w 2 表示启动 2 个 worker 用于处理请求(一个 worker 可以理解为一个进程),通常将 worker 数目设置为 CPU 核心数的 2-4 倍。

-k gthread 指定每个 worker 处理请求的方式,根据大家的实践,指定为 gthread 的异步模式能获取比较高的性能,因此我们采用这种模式。

-b 0.0.0.0:8000,将服务绑定到 8000 端口,运行通过公网 ip 和 8000 端口访问应用。

访问 ip:8000(ip 为你服务器的公网 ip),应用成功访问了,但是我们看到样式完全乱了。别急,这不是 bug!此前我们使用 django 自带的开发服务器,它会自动帮我们处理静态样式文件,但是 Gunicorn 并不会帮我们这么做。因为处理静态文件并不是 Gunicorn 所擅长的事,应该将它交给更加专业的服务应用来做,比如 Nginx。

启动 Nginx 服务器

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,它的功能非常多,这里我们主要用它来处理静态文件以及将非静态文件的请求反向代理给 Gunicorn。

当我们访问一个博客文章详情页面时,服务器会接收到下面两种请求:

  • 显示文章的详情信息,这些信息通常保存在数据库里,因此需要调用数据库获取数据。
  • 图片、css、js 等存在服务器某个文件夹下的静态文件。

对于前一种请求,博客文章的数据需要借助 django 从数据库中获取,Nginx 处理不了,它就会把这个请求转发给 运行在 Gunicorn 服务中的 django 应用,让 django 去处理。而对于后一种静态文件的请求,只需要去这些静态文件所在的文件夹获取,Nginx 就会代为处理,不再麻烦 django。

用 django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理,这就是我们要使用 Nginx 的原因。

首先安装 Nginx:

yangxg@server:$ sudo yum install epel-release -y
yangxg@server:$ sudo yum install nginx -y

运行下面的命令启动 Nginx 服务:

yangxg@server:$ sudo systemctl start nginx

在浏览器输入 ip(不输入端口则默认为 80 端口,Nginx 默认在 80 端口监听请求),看到 Nginx 的欢迎界面说明 Nginx 启动成功了。

配置 Nginx

Nginx 的配置位于 /etc/nginx/nginx.conf 文件中,你可以打开这个文件看看里面的内容,下面是一些关键性的配置:

user nobody nobody;
...
http {
    # 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 / {
        }
    }
}

首先是这个 user 配置,用于指定 Nginx 进程运行时的用户和组(分别为第一个和第二个参数),为了防止可能的权限问题,我们改成当前系统用户(我的用户名是 yangxg,所属组 yangxg,记得改成你自己服务器中运行的用户和组,修改完后记得保存文件内容):

user yangxg yangxg;

然后在 http 配置下有一个 server 模块,server 模块用于配置一个虚拟服务,使这个虚拟服务监听指定的端口和域名。你可以配置多个 server,这样就会启动多个虚拟服务,用于监听不同端口,或者是同一个端口,但是不同的域名,这样你就可以在同一服务器部署多个 web 应用了。

这个 server 的配置我们下面会详细讲解,再来看看 server 下的 include,include 会将指定路径中配置文件包含进来,这样便于配置的模块化管理,例如我们可以把不同 web 应用的配置放到 /etc/nginx/conf.d/ 目录下,这样 nginx 会把这个目录下所有以 .conf 结尾的文件内容包含到 nginx.conf 的配置中来,而无需把所有配置都堆到 nginx.conf 中,使得配置文件十分臃肿。

我们来配置博客应用,上面说了,为了模块化管理,我们将配置写到 /etc/nginx/conf.d/ 目录下。先在服务器的 conf.d 目录下新建一个配置文件,我把它叫做 HelloDjango-blog-tutorial.conf。写入下面的配置内容:

server {
    charset utf-8;
    listen 80;
    server_name hellodjango-blog-tutorial-demo.zmrenwu.com;

    location /static {
        alias /home/yangxg/apps/HelloDjango-blog-tutorial/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}

首先我们配置了一个虚拟服务,编码方式为 utf-8,监听于 80 端口。

服务的域名为 hellodjango-blog-tutorial-demo.zmrenwu.com,所以来自这个域名的请求都会被这个服务所处理。

所有URL 匹配 /static 的请求均由 Nginx 处理,alias 指明了静态文件的存放目录,这样 Nginx 就可以在这个目录下找到请求的文件返回给客户端。

其它请求转发给运行在本机 8000 端口的应用程序处理,我们会在这个端口启动 Gunicorn 用于处理 Nginx 转发过来的请求。

重启 nginx 使得配置生效:

yangxg@server:$ sudo systemctl restart nginx

关闭 DEBUG 模式,收集静态文件

开发环境下,django 为了调试方便,会将 settings.py 文件中的 DEBUG 选项配置为 True,这样如果程序运行出错,调试信息将一览无余,这在开发时很方便,但部署到线上就会带来巨大安全隐患,所以我们把 DEBUG 选项设置为 False,关闭调试模式,在本地将 settings.py 中的 DEBUG 为:

DEBUG=False

线上服务器更新最新的代码,然后运行命令收集静态文件到之前配置的 STATIC_ROOT 目录下:

yangxg@server:$ pipenv run python manage.py collectstatic

然后使用 Gunicorn 启动服务。

yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000

现在,访问配置的域名 hellodjango-blog-tutorial-demo.zmrenwu.com(改成你自己在 Nginx 中配置的域名),可以看到博客成功部署!

管理 Gunicorn 进程

现在 Gunicorn 是我们手工启动的,一旦我们退出 shell,服务器就关闭了,博客无法访问。就算在后台启动 Gunicorn,万一哪天服务器崩溃重启了又得重新登录服务器去启动,非常麻烦。为此使用 Supervisor 来管理 Gunicorn 进程,这样当服务器重新启动或者 Gunicorn 进程意外崩溃后,Supervisor 会帮我们自动重启 Gunicorn。

先按 Ctrl + C 停止刚才启动的 Gunicorn 服务进程。

首先安装 Supervisor。注意这里使用的是系统自带的 pip2,因为截至本教程书写时 Supervisor 还不支持 Python3,不过这并不影响使用。

yangxg@server:$ pip install supervisor

为了方便,我一般会设置如下的目录结构(位于 ~/etc 目录下)来管理 Supervisor 有关的文件:

~/etc

├── supervisor
│   ├── conf.d
│   └── var
│       ├── log
└── supervisord.conf

其中 supervisord.conf 是 Supervior 的配置文件,它会包含 conf.d 下的配置。var 目录下用于存放一些经常变动的文件,例如 socket 文件,pid 文件,log 下则存放日志文件。

首先来建立上述的目录结构:

yangxg@server:$ mkdir -p ~/etc/supervisor/conf.d
yangxg@server:$ mkdir -p ~/etc/supervisor/var/log

然后进入 ~/etc 目录下生成 Supervisor 的配置文件:

yangxg@server:$ cd ~/etc
yangxg@server:$ echo_supervisord_conf > supervisord.conf

修改 supervisor.conf,让 Supervisor 进程产生的一些文件生成到上面我们创建的目录下,而不是其默认指定的地方。

首先找到 [unix_http_server] 版块,将 file 设置改为如下的值:

[unix_http_server]
file=/home/yangxg/etc/supervisor/var/supervisor.sock

即让 socket 文件生成在 ~/etc/supervisor/var/ 目录下。注意 supervisor 不支持将 ~ 展开为用户 home 目录,所以要用绝对路径指定。

类似的修改 [supervisord] 板块下的 logfile 和 pidfile 文件的路径,还有 user 改为系统用户,这样 supervisor 启动的进程将以系统用户运行,避免可能的权限问题:

logfile=/home/yangxg/etc/supervisor/var/log/supervisord.log
pidfile=/home/yangxg/etc/supervisor/var/supervisord.pid
user=yangxg

还有 [supervisorctl] 板块下:

serverurl=unix:///home/yangxg/etc/supervisor/var/supervisor.sock

[include] 版块,将 /home/yangxg/etc/supervisor/conf.d/ 目录下所有以 .ini 结尾的文件内容包含到配置中来,这样便于配置的模块化管理,和之前 Nginx 配置文件的处理方式是类似的。

files = /home/yangxg/etc/supervisor/conf.d/*.ini

然后我们到 conf.d 新建我们博客应用的配置:

[program:hellodjango-blog-tutorial]
command=pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/yangxg/apps/HelloDjango-blog-tutorial
autostart=true
autorestart=unexpected
user=yangxg
stdout_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log
stderr_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log

说一下各项配置的含义:

[program:hellodjango-blog-tutorial] 指明运行应用的进程,名为 hellodjango-blog-tutorial。

command 为进程启动时执行的命令。

directory 指定执行命令时所在的目录。

autostart 随 Supervisor 启动自动启动进程。

autorestart 进程意外退出时重启。

user 进程运行的用户,防止权限问题。

stdout_logfile,stderr_logfile 日志输出文件。

启动 Supervisor

yangxg@server:$ supervisord -c ~/etc/supervisord.conf

-c 指定 Supervisr 启动时的配置文件。

进入 supervisorctl 进程管理控制台:

yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf

执行 update 命令更新配置文件并启动应用。

浏览器输入域名,可以看到服务已经正常启动了。

使用 CDN 加快 Bootstrap 和 jQuery 的加载速度

我们的项目使用了 Bootstrap 和 jQuery,这两个文件我们是从本地加载的。如果服务器性能比较差的话,加载需要耗费很长的时间,网站打开的速度就变得无法忍受。我们使用 CDN 来加快加载速度。具体来说,替换 base.html 的几个静态文件的加载标签:

base.html

- <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
- <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
- <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
+ <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
+ <script src="https://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
+ <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

本地修改代码后,将代码同步到线上服务器,执行下面的命令重启 hellodjango-blog-tutorial 应用进程:

yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf restart hellodjango-blog-tutorial 

这样网站访问的速度将大大提升!

总结

部署步骤很多且繁杂,因为每个环境都不一样,因此部署是最容易出错的步骤,一定要搞清楚每一步的作用,这样在遇到问题时,才能针对性地去解决,如果只知道一味地复制粘贴命令,而不知道自己在干嘛,那么一旦出错将束手无策。

部署过程自动化

在整个部署过程中我们运行了十几条命令,手动输入了 N 个字符。如果每次更新代码都要远程连接到服务器执行这些命令的话将变得非常麻烦。接下来的教程我们将介绍使用 Fabric 自动化整个部署过程。写好部署脚本后,只需要执行一条命令,就可以非常方便地自动完成整个部署。

-- EOF --

101 评论
登录后回复
温理低能王
2023-03-29 15:54:22
回复
温理低能王
2023-03-28 15:20:04

提示:如果您无法通过 IP 地址访问 Django 开发服务器,则有几个可能的原因。防火墙问题:请确保您的防火墙没有阻止了端口 8000 上的流量。您可以尝试关闭防火墙或打开端口 8000。在 CentOS 系统上,可以使用以下命令关闭防火墙:sudo systemctl stop firewalld

服务器端口问题:
请确保 Django 服务器正在监听端口 8000。如果您的服务器有多个 IP 地址,可能会发生这种情况。请使用以下命令检查 Django 服务器是否在侦听端口 8000。
sudo netstat -tlnp | grep 8000
如果 Django 正在侦听端口 8000,则应该看到类似于以下内容的输出:
其中 1234 是 Django 服务器进程的 PID。
自己遇到的问题,通过第一个方法解决了。大家可以参考一下

回复
温理低能王
2023-03-26 16:22:29

git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
这里不能下载你的github上的代码吗 我下面这句一直报错
pipenv install --deploy --ignore-pipfile
TypeError: 'NoneType' object is not callable
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/13 — 0

回复
Lingzhi Cao
2023-01-29 08:41:33

老师您好,我看了您的教程终于成功的在AWS上搭了一个小主页出来,您后面讲的fabric自动部署的那个script在经过细微调整之后也可以很方便的工作了,万分感谢您的教程

但是这边我还有一个小疑问,我们的主页后面可能想展示一些交互性的算法之类的东西,这样的话后台就会用到numpy pandas matplotlib 之类的包,但是好像我一旦在本地安装了使用 pipenv install numpy 这样的命令去装numpy之类的包,Pipfile.lock就会发生变化,虽然在本地上项目是正常运行的,但是一旦push到git上然后再pull到AWS端就会出现错误

我有注意到您前面讲的时候在服务器端安装了guicorn之后有一个先push Pipfile和 Pipfile.lock 然后拉取到本地的操作,好像是为了避免后续本地push项目的时候Pipfile中缺少gunicorn,不知道对于我说的这种需要更新Pipfile的case (需要安装新的包) 有没有类似的操作可以避免报错呢,先提前谢谢您了

回复
threeTrave
2023-01-18 16:35:25

这一章我做了4天。。。我的python是3.10的,到pipenv下载依赖包就开始报错了,自己找了好多资料,有的直接复制粘贴,好几次想放弃了。但是最后博客终于搭建成功的一刻,我觉得所有的努力都值了。最近我会整理下资料,如果有版本号和我一样高于博主的版本的可以参考一下。愿大家少遇坑。

回复
threeTrave threeTrave
2023-01-18 21:18:46

我来交作业了 我的博客

回复
TestNovice
2022-11-16 22:51:23

第一步的sqlite下的 ./configure就报错,这玩锤子

回复
Lingzhi Cao TestNovice
2023-01-29 08:42:45

可能是你的服务器没有默认安装gcc

sudo yum install gcc 应该就好了

回复
JeremyCheng
2021-05-07 16:46:32

大佬help me!

进入虚拟环境进不了,被这个错误搞好久,弄不了。

[cenjw@izbp1ef9b1nhiozo7udeckz apps]$ virtualenv --python=python3.7 env
created virtual environment CPython3.7.0.final.0-64 in 420ms
  creator CPython3Posix(dest=/home/cenjw/apps/env, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/cenjw/.local/share/virtualenv)
    added seed packages: pip==21.1.1, setuptools==56.0.0, wheel==0.36.2
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

回复
zjb617
2021-02-03 02:20:06

Ubuntu18.04部署成功,这一块真是耗费了好久的时间,每一个报错,不会就查,有时候都不知道为什么会错,也就放那了。之后又想起来,搞来搞去,都不知道哪里被弄乱了,还不如重新从头开始。终于,在这卡了三天的终于成功了。这个过程中学到了很多,感谢博主的教程,以及各位大佬们的评论帮助,没有你们相助,怕是要十天半个月才能搞定,再次感谢!

回复
startlearner
2021-02-02 15:22:41

请问博主,为什么我的nginx代理的静态资源访问到了,但是页面的样式还是不对,这是为什么呢?

回复
startlearner startlearner
2021-02-02 15:45:22

用python manage.py runserver启动时是没有问题

搜了一下午终于找到了解决方法,即在urls中添加以下代码

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

... the rest of your URLconf goes here ...

urlpatterns += staticfiles_urlpatterns()

回复
startlearner startlearner
2021-02-02 15:57:15

好吧,上面只是解决了gunicorn启动django时静态文件的加载的问题,使用image.png依然压面样式错误,费解

回复
startlearner startlearner
2021-02-02 15:58:04

location /static {
alias /home/yangxg/apps/HelloDjango-blog-tutorial/static;
}路径配置没问题啊

回复
startlearner startlearner
2021-02-02 15:59:04

注释掉nginx /static代理加载之后页面样式正常了

回复
startlearner startlearner
2021-02-02 16:06:58

debug=False页面样式也不行,必须debug=True才行

回复
startlearner startlearner
2021-02-03 17:29:31

终于解决了,需要在nging.conf里面加include mime.types;

回复
sailor613
2020-10-29 11:07:49

大佬,我按照你的步骤操作到pipenv install --deploy --ignore-pipfile这个步骤卡壳了,报错如下:
[root@localhost HelloDjango-blog-tutorial]# pipenv install --deploy --ignore-pipfile
Installing dependencies from Pipfile.lock (bd1720)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 2/2 — 00:00:00
An error occurred while installing django-haystack==

python:3.7.7
Package Version


appdirs 1.4.4
certifi 2020.6.20
distlib 0.3.1
filelock 3.0.12
importlib-metadata 2.0.0
pip 20.2.4
pipenv 2020.8.13
setuptools 41.2.0
six 1.15.0
virtualenv 20.1.0
virtualenv-clone 0.5.4
zipp 3.4.0

服务器:centos7

回复
sailor613 sailor613
2020-10-29 11:10:53

错误代码上传的时候显示错误,还没弄明白怎么上传

回复
sailor613 sailor613
2020-10-29 11:11:43

An error occurred while installing django-haystack==2.8.1

hash=sha256:8b54bcc926596765d0a3383d693bcdd76109c7abb6b2323b3984a39e3576028c! Will try again.
An error occurred while installing django-pure-pagination==0.3.0 --hash=sha256:02b42561b8afb09f1fb6ac6dc81db13374f5f748640f31c8160a374274b54713! Will try again.

回复
追梦人物 sailor613
2020-11-11 18:04:57

我比较怀疑是网络问题吧,pypi 换成国内的源试试看。

回复
易羽
2020-09-16 17:56:50

你是否少了*.ini的文件 我也是研究了一会才发现需要这么一个文件

回复
易羽 易羽
2020-09-16 17:57:38

。。。我是回答楼下的。。。

回复
易羽 易羽
2020-09-16 17:59:23

要在这个目录files = /home/yangxg/etc/supervisor/conf.d/.ini
下新建一个配置文件 名字随便起但必须以
.ini结尾 就跟nginx一样 需要注意的是[include]和files都被默认注释掉了 要把前面的*号去掉

回复
gu0cc 易羽
2021-09-08 16:55:12

请问是在 files = /home/yangxg/etc/supervisor/conf.d/.ini目录下创建一个.ini文件
还是在 files = /home/yangxg/etc/supervisor/conf.d/ 下创建一个.ini文件

回复
HEY-BLOOD
2020-08-20 06:03:00

一步一步安装博主的教程部署 Nginx + Gunicorn 能完美运行,一用上 Supervisor 就不行了,报错信息如下:

[blood@server ~]$ sudo systemctl restart nginx
[sudo] password for blood: 
[blood@server ~]$ supervisord -c ~/etc/supervisord.conf
Unlinking stale socket /home/blood/etc/supervisor/var/supervisor.sock
[blood@server ~]$ supervisorctl -c ~/etc/supervisord.conf
supervisor> update
supervisor> exit

[blood@server ~]$ supervisorctl -c ~/etc/supervisord.conf restart django-blogproject
django-blogproject: ERROR (no such process)
django-blogproject: ERROR (no such process)

自己也重新配置了几次 supervisor 依然不行,supervisor 的进程似乎根本就没有启动,请问应该怎么解决呢?

回复
ning2510 HEY-BLOOD
2020-08-20 10:30:02

请问在 /etc/nginx/conf.d/HelloDjango-blog-tutorial.conf 中 server_name 后填写的域名是随意填写的吗...

回复
追梦人物 ning2510
2020-10-19 11:55:44

你想部署的域名,如果没有域名的话可以暂时填写服务器的 ip。

回复
追梦人物 HEY-BLOOD
2020-10-19 11:56:31

见楼上的回答,哈哈。

回复
ning2510
2020-08-18 20:43:47

请问在 /etc/nginx/conf.d/HelloDjango-blog-tutorial.conf 中 server_name 后填写的域名是随意填写的吗,在这一步比较懵。

回复
ZhangYide
2020-07-21 14:16:02

在使用Nginx前使用pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000启动,使用Nginx后为什么变成pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000了啊?

回复
ZhangYide ZhangYide
2020-07-21 14:39:59

我自己试了下,127.0.0.1:8000 and 0:800都可以,能给解释一下什么意思吗?

回复
ZhangYide ZhangYide
2020-07-21 16:02:17

大概理解了,不知道对不对:
使用Nginx后,访问服务器首先访问Nginx服务器,由于Nginx中server设置为:

server {
    charset utf-8;
    listen 80;
    server_name 192.168.0.105;

    location /static {
        alias /home/username/apps/django-blog/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}

所以,当访问静态文件时,就会到/home/username/apps/django-blog/static下寻找,其他访问则转到http://127.0.0.1:8000,即gunicorn启动的Django服务。

回复
追梦人物 ZhangYide
2020-07-25 20:27:12

因为当使用 Nginx 做反向代理服务器时,Nginx 和应用程序同属一台主机,可直接通过 127.0.0.1:8000 直接通信,django 程序隐藏在 Nginx 背后,Nginx 自身对公网开发,监听来自 80 端口的请求。

回复
ZhangYide
2020-07-21 12:44:10

按照您的方法,"关闭 DEBUG 模式,收集静态文件"后,依旧加载不出静态文件。之前用runserver运行时没有问题。
而且直接本地访问服务器ip显示

502 Bad Gateway
nginx/1.16.1

查了各种STATIC_ROOT, STATIC_URL设置方法都不能彻底解决这个问题。

回复
ZhangYide ZhangYide
2020-07-21 14:25:12
回复
ZhangYide
2020-07-19 14:36:49

之前一直用的MySQL数据库,这里怎么突然变成SQLite3了?代码不用修改吗?

回复
追梦人物 ZhangYide
2020-07-19 20:16:39

没有呀,一直用的 sqlite。

回复
ZhangYide 追梦人物
2020-07-19 22:25:02

实在抱歉,我自己用的MySQL,两篇教程看混了。。。

回复
1898z
2020-07-17 23:08:31

博主您好,pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0
.0.0:8000启动就可以访问到页面但是没有静态资源,
而使用pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000访问却显示无法访问是为什么呢

回复
追梦人物 1898z
2020-07-19 20:21:54

线上环境关闭了 debug,django 不再处理静态资源文件,需要 Nginx 来处理。

回复
sometimestios
2020-07-06 23:23:14

配置nginx.conf那里,如果不把用户名改成当前用户,会遇到权限问题访问不到静态文件(get 403),页面的格式就乱了。

回复
thollang
2020-07-02 22:26:44

说一个可能的小坑
···
;[include]
```

回复
thollang thollang
2020-07-02 22:27:56
;[include]

这个模块的前的注释也要去掉哦
否则不会引入*.ini这个配置文件,从而导致不会启动进程

回复
Mrhuo928
2020-06-13 15:45:00

博主你好,请问我在admin后台添加文章的时候,在正文部分写字超过一定数量就会报错

500 Internal Server Error
nginx/1.16.1

然后我去查nginx的报错日志,显示

2020/06/13 15:43:25 [crit] 22475#0: *68 open() "/var/lib/nginx/tmp/client_body/0000000014" failed (13: Permission denied), client: 27.8.194.219, server: mrhuo-yefinch.com, request: "POST /admin/blog/post/206/change/ HTTP/1.1", host: "mrhuo-yefinch.com", referrer: "http://mrhuo-yefinch.com/admin/blog/post/206/change/"

请问是怎么回事呢?

回复
Mrhuo928 Mrhuo928
2020-06-13 16:01:29

找到解决方法了,打扰博主了。抱歉
解决路径如下https://blog.csdn.net/peng2hui1314/article/details/105572626
若遇到同样问题的小伙伴可以参考一下。

回复
iftrue
2020-06-05 22:21:29

为啥我流程全按博主的来,最后静态文件都加载不到,这个问题困扰了很多天了,重复操作了好几次,就是搞不明白哪里出了问题,有进行collectstaticfiles

回复
追梦人物 iftrue
2020-06-08 11:06:54

调试技巧,按F12看一下实际加载的静态资源路径,然后看看和项目中的路径是否匹配,以及 Nginx 设置的路径是否匹配。

回复
用户9206127147
2020-05-07 13:26:59

STATICFILES_DIRS = [

os.path.join(BASE_DIR, 'static') 之前加载静态文件用的

]

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
博主,你好,我想问一下这两种可以二选一吗,我在本机上运行任选都可以,服务器上还不知道

回复
追梦人物 用户9206127147
2020-05-13 08:37:58

第一个用于指定非 django 应用的静态文件所在目录,这样 django 才能找到。详细的说明可参考 django 官方文档:https://docs.djangoproject.com/en/3.0/howto/static-files/deployment/

回复
Me-ironman
2020-04-20 23:23:20

博主你好,按照你的教程部署运行了很长时间都没问题,非常感谢.但是最近因为有一个接口需要耗时(最多75秒),因为nginx默认60s就超时了,所以更改nginx配置中的proxy_read_timeout 为90秒.运行起来也没问题,但是过一天左右服务器就会 504 gateway timeout ,后台查看发现都是 127.0.0.1:8000 close_wait 导致服务器超时无响应,多次排查确定就是因为proxy_read_timeout 设置90s的原因,百度无果,所以请教一下博主有什么思路指点吗?谢谢!

回复
追梦人物 Me-ironman
2020-05-05 11:20:13

建议优化,90秒的接口调用不可接受。如果是耗时任务,使用 celery 或者 django-q 作为后台异步任务运行。

回复
F1sh-Yu
2020-04-09 17:07:01

大神,我在nginx配置改完后访问自己的域名出来的还依然是欢迎界面,如果把server_name改成ip地址,就会出现502 Bad Gateway,求救!

回复
YAO ZELIANG
2020-04-07 16:41:38

不知道有没有因为部署烦心的小伙伴

我推荐使用heroku,如果仅仅是以学习Django开发为主要目的,基本上3分钟就搞定了gunicorn+whitenoise+heroku

我自己的例子:https://yaozeliang.herokuapp.com/

回复
TheMortal
2020-03-30 17:17:48

pipenv run python manage.py runserver 0.0.0.0:8000后没有报错,但是通过IP:8000无法访问,网页显示Server Error (500)。(防火墙是关闭状态的,服务器安全组的端口是全开的,在本地是可以通过127.0.0.1:8000访问的)

回复
追梦人物 TheMortal
2020-04-10 19:53:19

500 是后台报错了,看下报错日志。

回复
psauxgrep
2020-03-23 18:01:05

按照您的步骤一步一步进行,但是到最后nginx加载不出静态资源,就样式是乱的,所有步骤都和你一样

回复
sunxiaofeiyes
2020-03-17 18:28:29

请教博主,根据博主的教程,我的网站成功部署了,但是有个问题,使用8000端口我可以访问,但是直接用域名或IP不加8000端口就无法访问,可能是哪里出问题了呢,服务器安全组已全部开放了

回复
追梦人物 sunxiaofeiyes
2020-03-21 16:43:20

说明你将服务启动在 8000 端口,而不是默认的 80(http)或者 443(htttps)

回复
Chen_github
2020-02-28 01:00:11

Supervisorctl update 启动项目失败,不使用supervisor 可以启动,中间检查了 supervisord.conf 配置没问题,项目配置没问题,supervisord 启动配置指向正确且正常启动没有报错,supervisorctl 启动配置指向正确且正常启动没有报错,执行update 命令后没有报错,但是项目就是启动不起来,这真TM玄学...
博主有什么思路没???

回复
Chen_github Chen_github
2020-02-28 01:22:10

又查了 supervisor 的日志,没有错误信息

回复
Chen_github Chen_github
2020-02-28 19:16:16

问题搞了一整天,终于发现 supervisord.conf 配置参数前面有个 ; 号,这tm是注释!注释!修改后的所有参数都要把这个玩意给删掉!要不然不生效!!!

回复
Chen_github
2020-02-27 01:05:44

差点被自己搞死,配置好 nginx 之后 gunicorn 怎么都启动不起来了,排查了半天才发现后台已经有个 gunicorn 进程了,占用的是 8000 端口,可能是之前退出 xshell 时忘记这回事了

回复
aha
2020-02-11 22:52:39

求助博主,为啥我的nginx首页样式加载正常,但后台admin加载不了样式文件,我没有域名用公网ip访问的,配置文件除了server_name为_;这一章节其他都按要求做了,debug为false

回复
追梦人物 aha
2020-02-25 11:11:01

你没有 collectstaticfiles 吧?

回复
Ba-Gai
2020-01-19 11:46:01

supervisord.conf 生成不出来是啥子问题哦,

sudo su -root -c "echo_supervisord_conf > /etc/supervisor.conf"

然后出现这种情况

su: invalid option -- 'r'
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd
回复
追梦人物 Ba-Gai
2020-02-25 11:31:20

这个命令有问题吧,先切换到 root 用户,再执行生成命令试一下。

回复
giveup-llw
2019-12-02 15:42:52

Traceback (most recent call last):
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 92, in init_process
super().init_process()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/workers/base.py", line 119, in init_process
self.load_wsgi()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/home/liuliwei/.local/share/virtualenvs/Myblog-EBIlQ5u6/lib/python3.7/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1006, in _gcd_import
File "", line 983, in _find_and_load
File "", line 953, in _find_and_load_unlocked
File "", line 219, in _call_with_frames_removed
File "", line 1006, in _gcd_import
File "", line 983, in _find_and_load
File "", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'blogproject'
[2019-12-02 15:42:14 +0800] [28701] [INFO] Worker exiting (pid: 28701)
[2019-12-02 15:42:14 +0800] [28698] [INFO] Shutting down: Master
[2019-12-02 15:42:14 +0800] [28698] [INFO] Reason: Worker failed to boot.
在使用Gunicorn时报错

回复
giveup-llw
2019-11-28 15:11:02

"GET / HTTP/1.1" 400 61190
Invalid HTTP_HOST header: '122.51.86.116:8000'. You may need to add '122.51.86.116' to ALLOWED_HOSTS.
Bad Request: /favicon.ico

是不是之前setting里面设置了才会这样

回复
giveup-llw
2019-11-28 10:05:31

博主出现
Traceback (most recent call last):
File "manage.py", line 10, in main
from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "manage.py", line 21, in
main()
File "manage.py", line 16, in main
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
怎么办

回复
追梦人物 giveup-llw
2020-02-25 11:47:42
  1. 检查虚拟环境的配置
  2. 如果没问题,在虚拟环境中安装 django
回复
zizxzy
2019-10-26 22:29:50

博主你好,按照教程安装完成nginx之后,启动服务器之后,通过服务器公网ip访问一直是centos的欢迎界面。下面是nginx的状态,也显示已经在running了。
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2019-10-26 22:20:45 CST; 5min ago
Process: 3211 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 3209 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 3208 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 3214 (nginx)
CGroup: /system.slice/nginx.service
├─3214 nginx: master process /usr/sbin/nginx
└─3215 nginx: worker process

Oct 26 22:20:45 izbp1gs95lh0r5x5g9c1f2z systemd[1]: Starting The nginx HTTP...
Oct 26 22:20:45 izbp1gs95lh0r5x5g9c1f2z nginx[3209]: nginx: the configurati...
Oct 26 22:20:45 izbp1gs95lh0r5x5g9c1f2z nginx[3209]: nginx: configuration f...
Oct 26 22:20:45 izbp1gs95lh0r5x5g9c1f2z systemd[1]: Failed to parse PID fro...
Oct 26 22:20:45 izbp1gs95lh0r5x5g9c1f2z systemd[1]: Started The nginx HTTP ...
Hint: Some lines were ellipsized, use -l to show in full.

回复
xt-mao zizxzy
2020-01-11 16:33:07

你好,请问你最后怎么解决这个问题的,我也同样遇到了

回复
Chen_github xt-mao
2020-02-27 00:54:13

就是要显示centos的欢迎页吧

回复
又见霸王色 xt-mao
2021-04-10 16:38:05

/etc/nginx/nginx.conf 中的两个 80端口要改成别的,否则会出现访问80端口一直是欢迎界面

回复
zizxzy
2019-10-26 12:54:47

博主,你好。到将项目部署到云服务器上面时,最后运行项目也没有报错,然后通过服务器公网ip:8000一直无法访问。

回复
zizxzy zizxzy
2019-10-26 19:17:39

原来是阿里云的安全组策略没添加8000端口访问的问题

回复
zizxzy
2019-10-26 09:51:36

博主你好,我这边已经显示安装了wegt,但是使用命令时一直说找不到
[lizeyu@izbp1gs95lh0r5x5g9c1f2z src]$ sudo yum install -y wget
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* elrepo: mirrors.neusoft.edu.cn
* elrepo-kernel: mirrors.neusoft.edu.cn
Package wget-1.14-18.el7_6.1.x86_64 already installed and latest version
Nothing to do
[lizeyu@izbp1gs95lh0r5x5g9c1f2z src]$ wegt https://sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
-bash: wegt: command not found

回复
zizxzy zizxzy
2019-10-26 10:06:09

抱歉 wget打成wegt了

回复
mar-heaven
2019-10-23 16:13:32

我看Github上supervitor上好像支持python3+了
image.png

回复
jw879
2019-10-18 14:27:37

博主我用你的git实施了项目依赖后,在创建数据库的时候一直显示django.db.utils.OperationalError: unable to open database file.这是什么情况?

回复
追梦人物 jw879
2019-10-19 19:52:52

最新版的代码?你在项目根目录建一个database文件夹试一下。

回复
jw879 追梦人物
2019-10-25 10:14:28

感谢博主,解决了

回复
mar-heaven jw879
2019-11-13 11:52:54

怎么解决的呢,我也遇到这个问题了

回复
conqueror
2019-10-14 20:52:19

pipenv install --deploy --ignore-pipfile
这一步的时候错了,Error:Pipfile not found!怎么来的Pipfile 文件以及如何忽略sqlite3 源文件呢?

回复
追梦人物 conqueror
2019-10-15 12:07:30

你没有用pipenv吧?翻到教程前面的环境搭建部分看一下。用git的话,把要忽略的文件加到 gitignore 文件,具体参考 git 的使用文档。

回复
cuohoh
2019-10-07 21:54:44

博主,跟着步骤来的,可是配置了nginx后重启还是nginx的欢迎页,不知道哪里出了问题,头大···

回复
cuohoh cuohoh
2019-10-08 19:35:27

搞明白了!配置的地址没添加www,浏览器访问自动加上了,好难发现

回复
转乾坤8492
2019-09-25 16:31:51

要这样才能正确安装 pip install --user pipenv

回复
Ming-1c 转乾坤8492
2019-10-17 11:51:53

安装后输入pipenv --version显示pipenv command not found,要添加环境变量
我的解决办法:
1、首先pipenv装在/root/.local/bin这个地方,敲命令进入到这里
2、然后在bin目录下敲命令:vi ~/.bashrc,进入该文件夹,在最后敲入export PATH="$PATH:/root/.local/bin",最后保存退出
3、敲入echo $PATH,可以看到pipenv已经添加到环境变量中
4、重启一下centos,输入pipenv --version,就不会出现错误了

回复
mossonli
2019-09-22 15:47:49

部署代码
启动开发服务器:
yangxg@server:$ pipenv run python manage.py runserver 0.0.0.0:8000
我通过域名:端口访问的时候,页面有但是静态文件好像不行?但是我看您的视频,您的静态文件【页面的样式】是正常的?麻烦问下,我的静态文件没加载成功是什么原因呀?

回复
追梦人物 mossonli
2019-09-23 17:12:31

如果是 clone 示例仓库的代码,需要把 debug 改为 false

回复
cosmosmagic
2019-09-19 18:42:05

博主,我运行gunicorn blog.wsgi -w 2 -k gthread -b 127.0.0.1:8080在本地可以访问;
运行gunicorn blog.wsgi -w 2 -k gthread -b 0.0.0.0:8080,可以通过公网IP:8080和域名:8080正常访问;
但是使用nginx和gunicorn blog.wsgi -w 2 -k gthread -b 127.0.0.1:8080,域名www.xxx.top,其他设置都是跟你一样的,通过ip或者域名访问时就会提示无法访问此网站

回复
追梦人物 cosmosmagic
2019-09-19 19:23:37

Nginx的配置看一下呢?

回复
cosmosmagic 追梦人物
2019-09-20 18:18:26

找到原因了。在阿里云控制台没有开放nginx监听的80端口= =

回复
hhzzer
2019-09-19 17:36:16

调试 supervitor失败,改用systemctl service 方式启动。感觉方便很多。

回复
ian_沈大头
2019-09-17 15:15:22

执行

supervisord -c ~/etc/supervisord.conf

报错如下

Traceback (most recent call last):
File "/usr/sites/sun.em.gg/env3/bin/supervisord", line 10, in
sys.exit(main())
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/supervisord.py", line 358, in main
go(options)
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/supervisord.py", line 368, in go
d.main()
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/supervisord.py", line 70, in main
self.options.make_logger()
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/options.py", line 1472, in make_logger
backups=self.logfile_backups,
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/loggers.py", line 417, in handle_file
handler = RotatingFileHandler(filename, 'a', maxbytes, backups)
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/loggers.py", line 212, in init
FileHandler.init(self, filename, mode)
File "/usr/sites/sun.em.gg/env3/lib/python3.6/site-packages/supervisor/loggers.py", line 159, in init
self.stream = open(filename, mode)
OSError: [Errno 6] No such device or address: '/root/etc/supervisor/var/supervisor.sock'

回复
ian_沈大头 ian_沈大头
2019-09-17 15:15:42

可是此地址明明有问题,而且权限也对

回复
追梦人物 ian_沈大头
2019-09-17 15:31:23

你是部在 root 用户下吗?'/root/etc/supervisor/var/supervisor.sock'这个文件有木有?权限对不对?

回复
ian_沈大头 追梦人物
2019-09-17 16:00:05

/root/etc/supervisor/var
目录下
srwxrwxrwx 1 root root 0 Sep 17 15:03 supervisor.sock

看起来没啥问题

回复
追梦人物 ian_沈大头
2019-09-17 17:01:06

嗯,没看到啥问题,最好不要部到root下吧。

回复