前言

又有段时间没写博客了,最近一直在写外包项目,都没啥空余时间。这几天花了不少时间做项目部署,也看了不少教程,这里就记录下整个过程,也方便以后要做类似部署的时候不用再查来查去了。

flask + uWSGI

看到网上的教程都是清一色的使用 virtualenv 来创建虚拟环境,但我更倾向于使用 anaconda 来管理虚拟环境,关于 Ubuntu 中 anaconda 的安装,可以参考这篇博客,安装完成后,建议在 anaconda 中添加清华源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
# 以上两条是Anaconda官方库的镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
# 以上是Anaconda第三方库 Conda Forge的镜像 # for linux
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
# for legacy win-64
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/
以上两条是Pytorch的Anaconda第三方镜像 conda config --set show_channel_urls yes

可以使用 conda info 命令来查看是否添加成功。

接着,我们创建一个虚拟环境

conda create -n "环境名称" python=python版本

然后通过命令 source activate 环境名称 进入虚拟环境

接着开始安装 flask 与 uWSGI

conda install flask
conda install uwsgi

这里我就借用一下别人博客里清一色的 Demo, 创建文件 myproject.py

from flask import Flask
app = Flask(__name__) @app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"

manage.py

from myproject import app

if __name__ == "__main__":
app.run()

输入 python manage.py 运行,然后浏览器输入 http://localhost:5000/ 即可看到结果

nginx

sudo apt-get update
sudo apt-get install nginx

接着,在 Nginx 的 sites-available 目录中创建一个新的服务器块配置文件

sudo nano /etc/nginx/sites-available/myproject

这个是我最开始使用的

server {
listen 80;
server_name server_domain_or_IP; location / {
include uwsgi_params; # 导入uwsgi配置
uwsgi_pass 127.0.0.1:8000; # 转发端口,需要和uwsgi配置当中的监听端口一致
}
}

完成后,保存文件,然后输入 sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled 将配置文件链接到 sites-enabled 目录

然后测试一下是否有语法问题

sudo nginx -t

若无问题,则重启 nginx

sudo systemctl restart nginx

配置 uWSGI

最后开始 uWSGI 相关文件的配置,看了网上的教程,感觉都很麻烦,通过同学了解到一个十分简单的方法,在我们之前创建的 manage.py 所在目录下,创建 uwsgi.iniuwsgi.pid

uwsgi.ini

[uwsgi]
module = manage:app
master = true
chdir = .
socket = 127.0.0.1:8000
chmod-socket = 660
vacuum = true
wsgi-file = manage.py # flask程序的启动文件
pidfile=./uwsgi.pid
limit-as = 512
http-timeout = 300
socket-timeout = 300
harakiri = 300

uwsgi.pid

20830

接着,通过以下命令,即可启动 uwsgi

注:需在创建的虚拟环境中输入

nohup uwsgi uwsgi.ini > wsgi.log 2>&1 &

结束命令

uwsgi --stop uwsgi.pid

重启命令

uwsgi --reload uwsgi.pid

然后,我们到本地浏览器中输入 http://server_domain_or_IP 即可看到结果


这里顺便再讲讲 nginx 配置 https

首先要先申请 SSL,申请成功后会用申请的域名为包名发送给你,打开后有

将 Nginx 目录下的两个文件上传到 /etc/nginx 目录下

然后将之前的 nginx 服务的配置文件改为

server {
listen 443;
server_name xxx; # 你的域名
ssl on;
ssl_certificate /xxx.crt;# 改成你的证书的名字
ssl_certificate_key /xxx.key;# 你的证书的名字
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_request_buffering off;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
include uwsgi_params; # 导入uwsgi配置
uwsgi_pass 127.0.0.1:8000; # 转发端口,需要和uwsgi配置当中的监听端口一致
}
}
server { listen 80; server_name xxx; # 你的域名 rewrite ^(.*)$ https://$host$1 permanent;#把http的域名请求转成https client_max_body_size 75M; }

剩下的步骤与上面 nginx 相同。这样,便可通过 https 进行访问了。

小节

这还是我头一次做环境部署,花了不少时间,在部署成功的那一刻,真的是十分开心。一开始是准备在 Windows 服务器上进行项目部署,捣鼓了两天没弄出来,就直接放弃然后转用 linux 服务器,半天多的时间就搞定了。然后今天早上搞 mysql 的远程连接也搞了一早上,服务器中防火墙、mysql权限什么全都做了,就是连不上,最后发现是因为安全组 3306 端口没打开,白白多花几个小时。。。还是太菜了

Ubuntu16.04 flask + nginx + uWSGI 部署的更多相关文章

  1. Flask + Nginx + uwsgi 部署过程

    一.安装Flask 1.itsdangerous tar xvf itsdangerous-0.23.tar.gz cd itsdangerous-0.23/ python setup.py inst ...

  2. certbot自动在ubuntu16.04的nginx上部署let's encrypt免费ssl证书

    终结CA收费时代,让互联网更安全 Install On Ubuntu systems, the Certbot team maintains a PPA. Once you add it to you ...

  3. Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

  4. [阿里云部署] Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器

    部署地址:123.56.7.181 Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器 这个标题就比之前的"ECS服务器配置Web环境的全过程及参考资料&qu ...

  5. Flask+Nginx+uWSGI在Ubuntu服务器上的配置

    Flask+Nginx+uWSGI在Ubuntu服务器上的配置 Step1 安装系统环境 Ubuntu服务器选择是阿里云的ECS服务,ECS提供单独的内存\CPU\带宽\存储规格可以选择,并且提供合适 ...

  6. 填坑!!!virtualenv 中 nginx + uwsgi 部署 django

    一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...

  7. nginx + uwsgi 部署 Django+Vue项目

    nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...

  8. CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇

    CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...

  9. Nginx + uWSGI部署中的一些小坑

    1.invalid host in upstream报错 重新启动nginx : sudo /etc/init.d/nginx restart 原因是在配置负载均衡nginx.conf配置文件时,发现 ...

随机推荐

  1. OAuth-授权机制

    一.应用场景 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片. 问 ...

  2. Redis学习与应用-位图

    什么是位图 位图bitmap是通过一个bit来表示某个元素对应的值或者状态,是由一组bit位组成,每个bit位对应0和1两个状态,虽然内部还是采用string类型进行存储,但是redis提供了直接操作 ...

  3. java算法-二分法查找实现

    什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别 ...

  4. 2019-2020-1 20199303《Linux内核原理与分析》第九周作业

    进程的切换和一般执行过程 知识总结 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是 ...

  5. Shutdown SpringBoot App

    文章目录 Shutdown Endpoint close Application Context 退出SpringApplication 从外部程序kill App Shutdown SpringBo ...

  6. flutter中使用redux之多界面互动

    在上一篇文章,我们介绍了如何在flutter中使用redux.在上一篇文章的例子中,我们使用了单界面集成redux,但是在实际项目中,我们通常涉及多个模块,每个模块涉及多个界面,那么如何使用redux ...

  7. 用两张图告诉你,为什么你的App会卡顿?

    有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...

  8. Centos7下查询jdk安装路径

    今天一个小实验需要安装jdk,用命令java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...

  9. POJ - 2387 Til the Cows Come Home (最短路入门)

    Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...

  10. Python (深浅拷贝)

    1.深拷贝  -->  克隆一份,修改拷贝后的内容不对原对象内容产生影响 拷贝后修改序列中元素内容,注意:被修改的元素不能为一个序列中的某个值 a = [["北京多测师",& ...