# flask部署总结笔记

## 旧的部署方法不推荐了!!!因为略显麻烦,且一不小心容易出错,强烈建议使用docker,轻松、快速、幸福地部署本项目,满满的幸福感~
## PS.学习docker可以前往docker官网,或者【菜鸟教程】网站,附链接:https://www.runoob.com/docker/docker-tutorial.html



## 在docker上部署项目


**安装docker**

**docker**的安装十分简单,你只需要执行一行命令:

```sh
sudo yum install docker
```



**构建镜像**

通过本地的dockerfile**构建一个镜像**,请进入(CD到)**项目主目录**,执行:

```sh
docker build -t questionnaire:1.0
```

其中,【questionnaire】为**项目镜像名**,1.0为**项目版本号**,可以自行设置



**运行容器**

```shell
docker run -p 8080:5001 questionnaire:1.0
```

项目将myschool **容器内**暴露出的端口(**5001**)映射到**本地服务器**端口(**8080**)上



**测试部署**

访问服务器的**8080**端口,如果返回以下信息,说明部署完成:

```json
{
    "errorCode": 0,
    "message": "Your project is running successfully!"
}
```



附:下面是本项目的**dockerfile**文件,在**项目根目录**下,可以将项目打包成镜像,**一般不需要修改**:

```dockerfile
FROM python:3.8
COPY . .
WORKDIR .
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
    && pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple
CMD ["gunicorn", "-c", "gunicorn.py", "manage:app"]
EXPOSE 5001
```



下面是本项目的**gunicorn**配置文件,在**项目根目录**下:

```python
bind = '127.0.0.1:5001'  # 绑定ip和端口号

workers = 1  # 进程数
threads = 2  # 指定每个进程开启的线程数
loglevel = 'debug'  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
accesslog = "/home/ubuntu/questionnaire/log/gunicorn_access.log"  # 访问日志文件
errorlog = "/home/ubuntu/questionnaire/log/gunicorn_error.log"  # 错误日志文件
```



## 设置转发

进行如上操作后,项目部署在了docker容器的**5001**端口,然后映射到服务器的**8080**端口
之后你可以利用nginx进行转发:

撰写配置文件 位于项目根目录下

```nginx
server {
    listen       80;
    server_name  api.yuzzl.top;
    location / {
        proxy_pass http://127.0.0.1:5001;
        proxy_redirect off;
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
```

寻找nginx安装目录 修改nginx.conf  定位到此处 添加一项

```nginx
	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
	//下面就是你要添加的 来自你的项目目录
	include /home/ubuntu/questionnaire/questionnaire.conf; 
```



## 以下是一般方法(不推荐)

### 处理虚拟环境

建立虚拟环境

```
virtualenv -p /usr/bin/python3 venv
```

激活虚拟环境

```
source venv/bin/activate
```

安装依赖

```
pip install -r requirements.txt
```

ps.   requirements.txt的生成方式

```
pip freeze > requirements.txt
```



### 处理gunicorn

撰写配置文件(此处比较简略 如要查看完成的配置文件样例 请参阅官方配置样例)位于项目根目录下

https://github.com/benoitc/gunicorn/blob/master/examples/example_config.py

```python
# gunicorn.py

bind = '127.0.0.1:5001'  # 绑定ip和端口号

workers = 1  # 进程数
threads = 2  # 指定每个进程开启的线程数
loglevel = 'debug'  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
daemon = True  # 守护进程,这里如果你是使用docker部署的,请不要添加
accesslog = "/home/ubuntu/questionnaire/log/gunicorn_access.log"  # 访问日志文件
errorlog = "/home/ubuntu/questionnaire/log/gunicorn_error.log"  # 错误日志文件
```

进入服务器虚拟环境 安装gunicorn

```
pip install gunicorn
```

运行app 左边的manage是你的py文件名 右边的app是你的文件里的app名

```
gunicorn -c gunicorn.py manage:app
```



### 设置转发

请参阅上方docker部署的【设置转发】条目。



### 附

杀死gunicorn

输出进程树

```
pstree -ap | grep gunicorn
```

找到对应的pid 执行

```
kill -9 pid
```



yuzhanglong

更新于2020年6月5日00:27