本人产品经理一枚,一直想自己搞个网站(飞狗小众景点网),于是学习了李辉大佬《Flask Web 开发实战》一书,历时大半年,终于学成,在部署时却反复踩坑,断断续续花了近一个月才部署成功,觉得有必要将自己的部署经验总结分享一下,让大家少走一些弯路。

本部署是基于LinuxUbuntu操作系统(当时买华为云服务器时,特地装B要了Linux,结果发现没有界面,全部要靠命令,-_-|| )

1.  安装基本库和工具

1.1 先更新系统可安装的包列表,并对可升级的包进行升级

$ apt update

$ apt upgrade

1.2 接着需要安装必备的包和开发工具

$ sudo apt install python3-dev python3-pip

1.3 安装Pipenv

sudo -H pip3 install pipenv

2.  创建项目目录

我把我的项目创建在了home/fegwo

华为云的cloudshell支持可视化创建文件夹(右键即可创建),不能可视化创建的,可以搜一下Linux创建文件夹的命令 mkdir

3.  推送代码到服务器

也就是把你本地的代码,上传到你刚刚建的目录,命令(下面的命令是在你本地电脑运行的)如下:

scp -r 你本地项目路径 root@你的服务器Ip地址:/home/fewgo

4.  安装依赖

进入到你linux系统中项目文件夹,执行下面的命令安装依赖

pip install -r requirements.txt

注:requirements.txt文件是你在本地开发时,需要生成的,用于记录依赖包。如果你开发时没有生成,那么你在服务器上运行程序时,会收到很多个提示:XXX Not defind,也就是你的依赖包没有被安装,也可以根据提示一个个安装。

安装成功后,你可以尝试用 flask run来启动程序(flask run)会启动你项目根目录下的wsgi.py文件。

运行成功后,还不能访问网站,因为linux根本没有浏览器窗口,没地方输入http://127.0.0.1:5000/,要支持远程访问,接下来要安装gunicorn。

5.  安装使用gunicorn

5.1 首先激活虚拟环境

在你的项目目录下source venv/bin/activate(activate就是激活的意思,退出虚拟环境用deactivate,暂时不用退出)

5.2 然后安装gunicorn

执行命令:pip install gunicorn

5.3 运行gunicorn

执行命令:gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app

注:需临时设置防火墙以允许对8000端口的访问,执行命令:sudo ufw allow 8000

执行后,可以查看防火墙的状态,执行命令:sudo ufw status

如果看到下面的内容,则表示防火墙8000开启成功

Status: active

To Action From

-- ------ ----

8000 ALLOW Anywhere

至此,如果你运行了gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app ,那么你在你本地的电脑浏览器输入 你的服务器ip:8000,就可以访问你的网站了,如果你的IP还解析了域名,也可以通过你的域名:8000访问。

如果你还不能访问,那么恭喜你,可能遇到了跟我一样的坑!云服务器的安全组没有开启8000端口!(很多云服务器阿里云、华为云等,除了防火墙外,还有一个安全组),这时候你需要登录你的云服务器安全组里添加8000端口(具体可以搜索百度一下)。

安全组开启之后,就可以正常访问了。因为gunicorn是后端服务,为了提供更好的性能服务,需要用Nginx来进行服务转发,将gunicorn的服务转发到Nginx上,所以接下来安装Nginx。

6.  使用Nginx反向代理

6.1 首先使用下面的命令安装Nginx

sudo apt install nginx

6.2 删除Nginx默认的配置文件,新增自己网站的Nginx文件

删除命令:$ sudo rm /etc/nginx/sites-enabled/default

新建命令:$ sudo nano /etc/nginx/sites-enabled/fewgo

6.3 编辑新建的Nginx文件,配置服务信息,如下

server {
    listen 80 default_server;
    server_name www.fewgo.cn; # 如果你映射了域名,那么可以写在这里,我的是www.fewgo.cn
    access_log /var/log/nginx/access.log;#可以不用改
    error_log /var/log/nginx/error.log;#可以不用改
 
    location / {
        proxy_pass http://127.0.0.1:8000; # 转发的地址,即Gunicorn运行的地址
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
 
    location /static { # 处理静态文件夹中的静态文件
    alias /home/greyli/bluelog/bluelog/static/;#这里是借鉴了李辉大佬书中的静态文件,具体可以换成你自己项目的静态文件
    expires 30d; # 设置缓存过期时间
    }
}

6.4 保存,检查Nginx语法正确性,执行如下命令:

$ sudo nginx –t

看到如下代码,则表示语法正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6.5 重启Nginx

$ sudo service nginx restart

这时候,你再运行 gunicorn -w 4 wsgi:app(没错,可以不加8000端口了)

运行之后,你就可以用服务器的IP或域名,直接访问网站了

7.  补充说明

7.1 安装Nginx之后,可以关闭防火墙8000端口了,执行如下命令$ sudo ufw delete allow 8000

7.2 gunicorn运行之后,按下Crtl+C停止Gunicorn(停止gunicorn会造成网站不能访问)

7.3 如果gunicorn运行失败,可能是端口被占用,这时候就要把占用的端口找出来,然后kill掉(端口占用查询及kill方法,自行百度)

最后,可以访问我部署好的网站来看看效果www.fewgo.cn,简称飞狗小众景点网,一个分享小众旅游景点的网站。