本人产品经理一枚,一直想自己搞个网站(飞狗小众景点网),于是学习了李辉大佬《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,简称飞狗小众景点网,一个分享小众旅游景点的网站。