用uwsgi和nginx 部署 django和vue打造的前后端分离项目

前言

由于现在没有彻底掌握nginx的使用,部署起来有点磕磕绊绊,为了防止以后再次需要部署的时候无法快速找到适合的资料,以此文章记录简单的部署步骤。

项目部署环境

  1. 阿里云 ubuntu16.04
  2. python3.6.8
  3. django 2.2
  4. fillzilla 用于上传文件到服务器

部署步骤

  1. uwsgi部署django项目。
  2. nginx部署vue项目。
  3. 配置nginx解决vue前端接口转发。

步骤1

uwsgi部署django项目。

django官方文档中关于用uwsgi部署django的文档:https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/

  1. 更改django的settings.py文件

    • DEBUG=True改为DEBUG=False
    • ALLOWED_HOSTS = ['*']
      ALLOWED_HOSTS是为了限定请求中的host值,以防止黑客构造包来发送请求。只有在列表中的host才能访问。强烈建议不要使用*通配符去配置,另外当DEBUG设置为False的时候必须配置这个配置。否则会抛出异常。这里暂时以 * 设置,等正式发布之后改成对应的域名。
  2. 安装uwsgi

    pip3 install uwsgi
    
  3. 准备uwsgi的配置文件

    假设我项目中的wsgi.py文件的路径如下。

      /home/enoch/blog/project_name/module_name/wsgi.py
    

    找一个自己喜欢的地方创建一个文件 uwsgi.ini并配置uwsgi.ini文件如下:

    [uwsgi]
    # chdir配置项目的根目录
    chdir=/home/enoch/blog/project_name
    
    # 可以用module或者wsgi-file配置,module配置为module=[wsgi.py文件上级目录的名称].wsgi:application
    # 此处采用wsgi-file的方式: [wsgi.py文件上级目录的名称]/wsgi.py
    wsgi-file=module_name/wsgi.py
    
    # 使用的python的虚拟环境的根目录
    home=/root/.pyenv/versions/enoch_blog
    
    # 通过http协议访问8000端口,待会儿nginx会通过这里来访问到后端的数据。也可以使用socket,如果采用socket,则nginx也要对应修改配置。此处采用http。
    http=0.0.0.0:8000
    
    # 下面的暂时可以不用管
    master=true
    chmod-socket=664
    vacuum=true
    
  4. uwsgi --ini uwsgi.ini 启动uwsgi服务

    进入到uwsgi.ini的所在路径中执行uwsgi --ini uwsgi.ini命令启动uwsgi服务,至此django的部署就告一段落。当然如果不进入到配置文件所在目录中也可以在命令中将路径直接写进去也可以。

  5. 这个时候可以通过用postman访问一下服务器上配置的后端是否能被访问到来测试一下后端的配置是否成功。

步骤二

nginx部署vue项目

  1. 先通过npm run build将vue项目打包。打包完成后会在前端项目的根目录里出现一个dist文件夹。

  2. 将第一步打包产生的dist文件夹放入服务器中想放的位置。

  3. 安装nginx

    sudo apt update
    sudo apt install nginx
    
  4. 启动nginx查看是否安装成功

    systemctl start nginx
    

    用命令启动nginx服务后,访问服务器地址,应该可以看到 Welcome to nginx!字样。这表示安装和启动nginx服务成功。

  5. 关于sites-available和sites-enabled的介绍

    在/etc/nginx路径下会有两个文件夹。一个是sites-available和sites-enabled。

    sites-available里面放的是一些nginx的配置文件,默认只有一个default。在sites-enabled中也有一个default,是sites-available中的default的软链接。放在sites-enabled中的文件是表示启用的配置文件,可以在/etc/nginx/nginx.conf文件中看到有如下的一行配置,可以看到sites-enabled中的所有配置文件都被引入进来了。

    include /etc/nginx/sites-enabled/*;
    
  6. 开始配置

    我们首先将sites-enabled中的default文件删除(因为只是一个软链接如果有需要可以再建立一个)。

    在sites-available中创建一个文件,例如叫blog.conf。

    配置内容如下:

    server {
        # 监听9090端口
        listen 9090;
    
        # 这里可以暂时先忽略
        server_name  test.com;
    
        # 当访问 http://ip地址/ 的时候
        # 这里是配置的前端项目
        location / {
            # root这里写打包好的前端项目的dist文件夹的路径(包括dist)
            root  /home/enoch/blog/enoch_blog_frontend/dist;
    
            # hash模式只配置访问html就可以了
            index  index.html;
    
            # history模式下
            try_files $uri $uri/ /index.html;
        }
    }
    
  7. 在sites-enabled中建立一个刚才创建的nginx配置文件的软连接到 sites-enabled文件夹中。

    cd ../sites-enabled
    ln -s ../sites-available/blog.conf
    
  8. 重启nginx服务,测试vue项目是否部署成功

    systemctl restart nginx
    

    访问 http://[ip地址]:[指定端口],如果能出现前端页面则vue项目部署成功。

步骤三

前端的接口请求转发。

经历了步骤一和步骤二之后,单独访问后端接口和单独访问前端页面都是可行的了,只是前端页面并不能拿到后端接口中的数据,这是为啥呢?因为前端的接口没有转发到后端上呀?本来这个事情在开发的时候是在vue.config.js中配置的,现在在生产环境下,就需要nginx来处理了。

我们重新打开步骤二中的blog.conf文件,添加配置location /api {...}。这个配置就是和vue项目中的vue.config.js中配置proxy是差不多的,添加完的blog.conf文件内容如下:

server {
        # 监听9090端口
        listen 9090;

        # 这里可以暂时先忽略
        server_name  test.com;

        # 当访问 http://ip地址/ 的时候
        # 这里是配置的前端项目
        location / {
            # root这里写打包好的前端项目的dist文件夹的路径(包括dist)
            root  /home/enoch/blog/enoch_blog_frontend/dist;

            # hash模式只配置访问html就可以了
            index  index.html;

            # history模式下
            try_files $uri $uri/ /index.html;
        }

        location /api {
            # 这里要对应上uwsgi中的配置
            proxy_pass http://[服务器ip地址]:[uwsgi中配置的端口]/api;
        }
}

配置完成后重启nginx服务即可

总结

这里的部署配置都是最基础的,能让项目跑起来的配置,现在的配置,在进入到django的admin中,会发现样式的丢失,关于这方面的处理以及其他的一些配置等后续再加入记录中。

其他

  1. 在为django项目迁移数据库的时候可能出现编码问题,此时可以通过修改mysql的配置文件,将默认编码改成utf8,再重新创建数据库解决。详见:https://blog.csdn.net/m0_38024592/article/details/83963865
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容