Django+uWSGI+Nginx微信公众号开发服务器配置

我有一个很有趣的想法,这几天我一直在努力把它变成现实,但对我来说真的是太难了。感觉自己知识储备好少。

上传代码

我在本地编写并测试好 Django 项目后,在项目文件夹初始化一个 git 仓库,并 push 到 github;再从 github 把项目 clone 到服务器上。以后每次提交代码,先从本地 push 到 github,再从github pull 到服务器上。

服务器上 runserver 启动 web 服务

在本地测试得好好的,到服务器上就不行,很奇怪。

把 ip 地址 由 127.0.0.1 改为 0.0.0.0 就可以了。

python3 manage.py runserver 0.0.0.0:8000

启动 uwsgi 服务

使用命令 uwsgi –http :8000 –module wechat.wsgi 能够正常启用,但是使用 uwsgi –ini uwsgi.ini 用配置文件的方式就不能正常运行。我的配置文件如下:

[uwsgi]
chdir = /data/wechat //项目根目录
module = wechat.wsgi //指定wsgi模块
socket = 127.0.0.1:8000 //对本机8000端口提供服务
master = true
processes = 4
vacuum = true
pidfile = /data/wechat/uwsgi.pid
daemonize = /data/wechat/run.log

我把后面的注释删除后就正常了。

Nginx 配置文件

我的配置文件 /etc/nginx/sites-available/default 是这样的:

# inside a http section
# replace the several paths and names
server {
    listen   80;
    server_name  io.xiake.me;

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
    location /static {
        alias /data/wechat/static;
    }
}

Token 验证失败

到微信公众号后台启用服务器配置。

我在本地反复测试都没有问题,但到了服务器上就不行,一直提示 token 验证失败。这应该是最令人无语的一个原因了: 在服务器地址那里, http://io.xiake.me/wechat 应写成 http://io.xiake.me/wechat/ ,URL 少了一个斜杠。

最后

有时候直接给一个 502 错误真的是很无语。

Nginx 的运行、错误日志在 Ubuntu 里默认是在 /var/log/nginx/

因为各种出错忙活了好久,但到写文章的时候又不知道写什么。说明我很多时间都在做无用功。

我把我的部署过程记录了下来,贴在下面:

---
layout: post
title: 2019年4月5日
---

## Django 项目

新建项目wechat

新建应用gitwe
```shell
python manage.py startapp gitwe
```

编写路由

修改 wechat/urls.py,可以看文件顶部的注释。

```python
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('wechat/', include('gitwe.urls')),
]
```

编写二级路由

在gitwe目录下新建urls.py,

```python
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home')
]
```

编写视图函数views.py

```python
from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.

def home(request):
    return HttpResponse('Talk is cheap. Show me the code.')
```

尝试运行web服务

成功。

使用git同步代码

在django项目根目录初始化git仓库,在github新建空仓库,将代码push到github;在vps上从github克隆仓库,pull代码。

尝试在vps运行web服务

失败

在阿里云后台防火墙添加自定义端口8000,启动runserver

拒绝了我们的连接请求。

去除csrf防护。运行,失败。(同时还添加了.gitignore文件)

成功。通过指定ip,允许非本地连接访问

```shell
$ python3 manage.py runserver 0.0.0.0:8000
```

出现错误

> Invalid HTTP_HOST header: '47.95.221.218:8000'. You may need to add '47.95.221.218' to ALLOWED_HOSTS.

Invalid HTTP_HOST header: 'io.xiake.me:8000'. You may need to add 'io.xiake.me' to ALLOWED_HOSTS.

修改settings.py,添加io.xiake.me到ALLOWED_HOSTS

运行runserver成功。

在阿里云后台防火墙删除自定义8000端口。

启动uwsgi服务

```shell
uwsgi uwsgi.ini
```

错误。502 Bad Gateway

尝试使用https://cloud.tencent.com/developer/labs/lab/10196 里的方式对nginx进行配置。

放弃。这个是反向代理。

关闭ufw防火墙,参考ufw使用指南 https://www.oschina.net/question/12_28619

```shell
ufw disable
```

在settings.py中添加static路径,测试是nginx的问题还是uwsgi的问题。

http://io.xiake.me/wechat/static/images/test1.jpg

图片访问不了,依然502 Bad Gateway,说明是nginx的问题。

又在阿里云后台防火墙添加了8000端口,直接访问http://io.xiake.me:8000/wechat/static/images/test1.jpg,打不开。io.xiake.me 拒绝了我们的连接请求。

我在uwsgi里设置了socket = 127.0.0.1:8000,也许我们根本就不能直接访问。

修改 /etc/nginx/sites-available/default。我发现我的备份找不到了!

https://www.nginx.com/resources/wiki/start/topics/examples/djangofastcgi/

/etc/nginx/sites-available/default 代码如下,sites-enabled里的default是一个链接。

```shell
# inside a http section
# replace the several paths and names
server {
    listen   80;
    server_name  io.xiake.me;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
    location /static {
        alias /data/wechat/static;
    }
}
```

http://io.xiake.me/static/images/test1.jpg 图片能够访问

添加测试路径,让首页显示原本/wechat显示的那句话;将127.0.0.1添加到ALLOWED_HOSTS
失败,依然502.

将github仓库改为私密

在setting.py中将DEBUG设置为False

## 2019年4月6日

将socket = 127.0.0.1:8000 改为0.0.0.0:8000,测试。
失败

通过命令uwsgi --http :8000 --module wechat.wsgi,直接访问http://io.xiake.me:8000/ 正常。

https://coding.imooc.com/learn/questiondetail/6367.html

修改nginx配置文件为

```shell
# inside a http section
# replace the several paths and names
server {
    listen   80;
    server_name  io.xiake.me;

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
    location /static {
        alias /data/wechat/static;
    }
}
```

502错误。

在后台运行uwsgi
uwsgi -d --http :8000 --module wechat.wsgi
提示unable to load configuration from :8000

修改uwsgi.ini文件,依照https://www.jianshu.com/p/dcf425c32517
```shell
[uwsgi]
chdir = /data/wechat //项目根目录
module = wechat.wsgi //指定wsgi模块
socket = 127.0.0.1:8000 //对本机8000端口提供服务
master = true
processes = 4
vacuum = true
pidfile = /data/wechat/uwsgi.pid
daemonize = /data/wechat/run.log
```

运行uwsgi --ini uwsgi.ini,失败。
删除uwsgi.ini里面的注释,成功。

访问io.xiake.me,成功。

最令人无语的token验证失败原因

http://io.xiake.me/wechat 应写成 http://io.xiake.me/wechat/

加入对话

1条评论

留下评论

电子邮件地址不会被公开。 必填项已用*标注