0.前言


这其实也是本网站的部署方式。

老规矩,上环境。截至2017年11月:

Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-62-generic x86_64)

uwsgi --version 2.0.15

nginx version: nginx/1.10.3 (Ubuntu)

supervisord -v 3.2.0

而开发环境是

4.13.12-1-ARCH  x86_64 GNU/Linux

参考资料(第一篇可以看看):

  1. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程
  2. 阿里云部署 Flask + WSGI + Nginx 详解
  3. 从0开始在腾讯云上部署一个 flask 项目
  4. 在阿里云CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目

1.创建Ubuntu并创建新用户


在阿里云购买好ECS,我选择的最便宜的1核那个,一年300多,买完之后在控制台可以选择系统,选择好后输入root用户的密码。

随后会告诉你一个网页上可以连接到服务器的密码,你得记住。随后在网页上登录到服务器。键入

adduser edison

创建一个新用户,当然了用户名你自己取,这里是我的名字。

随后在我的电脑上用ssh连接服务器,这样方便操作些,此处怎么ssh连接服务器就不说了,百度谷歌一大把。

此处先用

ssh root@ip 

来连接。会提示加入密钥回车就好,然后输入你root也就是刚开始创建云盘时的那个密码。就连接成功了。

输入

nano /etc/sudoers

为新创建的用户加入sudo权限:

输入

apt-get update

更新索引,这里如果比较慢的话可以替换成中科大的源,如何替换百度谷歌就有很多教学,也很简单。随后开始安装必要的软件。

2.安装python3和git


先安装python3

apt install python3-pip

随后使用pip3安装虚拟环境模块

pip3 install virtualenv

此时可以切换至edison这个新用户。

ssh edison@ip

我是把网站放在了github上,之后更新程序也方便管理。所以这里安装git

这里发现提示了

sudo: unable to resolve host:xxx

的信息,不影响使用的。可以通过修改hosts文件解决

输入y然后回车继续安装git。

在/home/edison下新建目录blog,在blog下git clone把源代码拷下来。

创建虚拟环境:

注意这里的虚拟环境使用的python3版本。

可以通过启动虚拟环境查看,确实是py3:

在blog下再新建一个logs文件夹。此时blog应该有三个文件夹,其他两个一个是venv文件夹一个是你的程序的文件夹。

3.安装nginx


输入

sudo apt-get install nginx

安装nginx。输入

sudo /etc/init.d/nginx start

启动服务,shell会显示ok提示启动nginx服务成功。这时候打开浏览器,直接输入你的ECS服务器的公网ip就可以看到

就说明nginx启动成功。接下来用一个小的flask程序进行小小的演示。

创建一个test.py:

然后在虚拟环境下(根据前文,这时候已经在虚拟环境中了,可以从下图的shell里第一行的前面的venv字眼看出)

pip3 install flask

安装flask模块。

4.安装uwsgi和supervisor并配置


接下来安装

pip install uwsgi

然后(此时所在文件夹是blog里)新建一个uwsgi的配置文件,并编辑以下内容,然后启用uwsgi:

可以看到uwsgi已经在运行了。这时候ctrl+c退出uwsgi。

接下来安装supervisor后进入配置文件夹,新建一个文件并输入:

sudo apt-get install supervisor
cd /etc/supervisor/conf.d
sudo nano blogSupervisor.conf

然后输入

sudo service supervisor start

开启进程管理。

5.配置nginx


进入/etc/nginx/sites-available/,编辑里面default文件,其中内容是:

 

然后输入

sudo service nginx restart

重启nginx服务器。打开浏览器输入你的公网ip,就能看到

Hello World! 啦

这里部署就基本完了,只要把上述的配置文件里提到test这个py文件替换成你的文件,例如manage.py就好了。

2017.12.29日更新:我发现有一个域名解析到了我的IP上,因为在国内,而且我的网站是备了案的,为了防止不必要的损失,应当防止空主机头以及禁止别人的域名解析到我的网站来。那么修改nginx的配置:

server
{
listen 80 default;
return 500;
}
server {
          listen  80 ;
          server_name www.chenlongyu.com chenlongyu.com;
          location / {
                include      uwsgi_params;
                uwsgi_pass   127.0.0.1:8001;  
                uwsgi_param UWSGI_PYHOME /xx/venv; 
                uwsgi_param UWSGI_CHDIR  /xx/xx; 
                uwsgi_param UWSGI_SCRIPT manage:app; 
          }
}

 

6.Mysql和后续


接下来简单说说怎么使用mysql:

安装pymysql,在config.py里使用

“mysql+pymysql://root:xxx@localhost:3306/xxxxx”

的方式启用mysql。

p.s

在使用mysql上尝试了很多方法,但是由于ubuntu的系统python是2,而虚拟环境中python为3,所以总有一些包安装不上,特别是mysqldb的问题,只能使用mysql+pymysql的方法。但是很奇怪的现象是,我的archlinux默认的python是3.6,使用的mariadb,但是不用pymysql也能连接上mysql,而且:

$ python                                                           
Python 3.6.3 (default, Oct 24 2017, 14:48:20) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> 

百思不得其解,如果有缘人看到了这里希望能给出答复。

另外如果你有什么疑问或者觉得哪里写的不对的还请留言评论告诉我~

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

2019-4-19 更新:

发现在archlinux上提示libmysqlclient.so.18: cannot open shared object file: No such file or directory,但是win10上(mysql)就正常。

以为mariadb-libs损坏,重装无效。然后google了一下,发现在1月初mariadb升级后有人的postfix也有这个问题,后来他通过升级postfix后解决了这个问题(不再依赖那个so.18文件),我就把1.3.12的mysqlclient用pip升级到了最新的1.4.2解决了这个问题。

随后升级了一下HTTPS,先在阿里上申请了一个免费的证书,将其丢到服务器上。安全组打开443。修改nginx配置:

server 
{ 
listen 80 default; 
return 500; 
}
server {
	  listen  80 ;
	  server_name www.chenlongyu.com chenlongyu.com;
	  return 301 https://www.chenlongyu.com$request_uri;
	}
server{
	listen 443;
	server_name www.chenlongyu.com chenlongyu.com;
	ssl on;
	ssl_certificate /home/xxxx.pem;
	ssl_certificate_key /home/xxxx.key;
	ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件>配置
        ssl_prefer_server_ciphers on;
        # 配置后端API
        location / {
                include      uwsgi_params;
                proxy_pass http://127.0.0.1:port;

        }
        # 指定log
        access_log /home/xxx.log;  # success_log
        error_log /home/xxx.log;  # error_log
        # 开启gzip
        gzip on;
        gzip_min_length 1k;  # 最小压缩范围
        gzip_buffers 4 16k;
        gzip_comp_level 5;  # 压缩级别1-9,越大压缩的越小
        gzip_types text/plain application/x-javascript text/css application/xml application/json text/javascript image/jpeg image/png;  # 指定压缩文件
        gzip_disable "MSIE [1-6]\.";
}

因为uwsgi原来配的是socket协议,https转发好像不行,所以改成了http。

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