最近因为完成了一个小项目的云服务器部署,在中间踩了很多的坑,所以写这篇文档,梳理一下自己的思路,好了废话不多,开始正文。
1. 首先你需要找一个自己喜欢的云服务器(我喜欢免费的),所以我就选择了腾讯云服务器的免费15天体验,这里我选择了Ubuntu Server 18.04.1 LTS 64位的服务器,这个版本的服务器自带了Python3.6和Pythonon 2.7哦,经过巴拉巴拉登录等操作,领取服务器等动作以后就可以看到下图的界面啦。
2.上述的图片中箭头表示的是后面后续需要用到的比较重要的地方,这里如果是微信等登录方式的,需要重置一下密码,重置后就可以登录啦,登录后就能得到一个终端的界面在浏览器中,这个时候的系统是一个纯净版的Ubuntu,我们需要自己来安装各种我们需要的库和软件。
3.说起安装Python3第三方库的话,就需要用到pip3啦,这里有坑注意
首先安装pip3:sudo apt-get install python3-pip
pip3 install --upgrade pip 更新pip3版本
更新pip3至最新版本后 - 需要修改 pip3 文件,流程如下
sudo vi /usr/bin/pip3
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
这样一来我们的pip3就能顺利的使用啦
4.这里就可以开始安装自己需要的库啦,如果没有用库导出的方法的话,就只能自己打命令来下载咯~
安装django:sudo pip3 install Django==1.11.8
安装jwt:sudo pip3 install pyjwt
安装uwsgi:sudo pip3 install uwsgi
安装pymsql:sudo pip3 install pymysql
官网下载 django-cors-headers-3.0.2.tar安装源码包,方法如下10.1 解压 tar -zxvf django-cors-headers-3.0.2.tar10.2 cd 至 解压后的目录 并执行 sudo python3 setup.py install
安装nginx:sudo apt-get install nginx
5.这里注意就是跨域请求头插件cors如果直接打命令的话会直接强制升级Django项目到最新版本的哦,所以如果项目是用其他Django版本创建的话,最好不要直接打命令的方式来下载哦,需要去官网下载包来安装,对了,这里的话来提一下如何传输文件到远程服务器吧,上传文件到服务器的方法有很多,比如windows操作系统中的WinSCP方法,XFTP一样可以提供在windows与Linux之间传输的文件的工具,同样提供有图形化的操作界面,操作起来会比较方便。
这里就介绍一个在Linux系统里比较简单的方法好啦!
操作步骤
在 Linux 操作系统的计算机上,执行以下命令,向 Linux 云服务器上传文件。
scp本地文件地址 云服务器登录名@云服务器公网 IP/域名:云服务器文件地址
例如,您需要将本地文件/home/lnmp0.4.tar.gz上传至 IP 地址为129.20.0.2的 CentOS 系统云服务器对应目录下,则执行的命令如下:
scp /home/Inmp0.4.tar.gz [email protected]:/home/Inmp0.4.tar.gz
按Enter,并输入登录密码,即可完成上传,这样一来,到时候项目也可以打包一起上传到服务器上咯。
如果需要从云服务器下载文件的话也是这样哦!
scp root@服务器地址:/服务器上文件名字或路径+空格+/本地路径
例如:
scp [email protected]:/opt/cheery/sys.log /d/workspace
6.这个项目中我用的是MySQL的数据库,所以当然必须要安装一下MySQL咯~
#命令1
sudo apt-get update
#命令2
sudo apt-get install mysql-server
安装好后当然需要先初始化配置一下咯~
sudo mysql_secure_installation
配置项较多,如下所示:
#1
VALIDATE PASSWORD PLUGIN can be used to test passwords...
Press y|Y for Yes, any other key for No: N (我的选项)
#2
Please set the password for root here...
New password: (输入密码)
Re-enter new password: (重复输入)
#3
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (我的选项)
#4
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y (我的选项)
#5 默认情况下,MySQL附带一个test的数据库,任何人都可以访问,可以选择是否需要删除
By default, MySQL comes with a database named 'test' that
anyone can access...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y(我的选项)
#6
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (我的选项)
好了,那么让我们来检查一下MySQL服务状态
systemctl status mysql.service
当然啦,如果你觉得每次都需要启动远程服务器来进入MySQL太麻烦的话呢,就要做配置远程访问啦
在Ubuntu下MySQL缺省是只允许本地访问的,如果你要其他机器也能够访问的话,需要进行配置;
首先用根用户进入
sudo mysql -uroot -p
登入root进行其他设置:
GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456";
其中root@localhos,localhost就是本地访问,配置成%就是所有主机都可连接;第二个'123456'为你给新增权限用户设置的密码,%代表所有主机,也可以是具体的ip;不过这随设置了%但我root通过工具还是登陆不进去,可能是为了安全性,所以新建数据库和用户;
新建数据库和用户
##1 创建数据库CREATE DATABASE movieserver;
##2 创建用户luckyxxxx(密码123456) 并允许luckyxxxx用户可以从任意机器上登入mysql的movieserver数据库GRANT ALL PRIVILEGES ON movieserver.* TO luckyxxxx@"%" IDENTIFIED BY "123456";
7.好啦,这里我就不写数据库表的建立或者数据库的迁移的内容啦~如果你的项目不想使用nginx映射呢,下一个8的内容就不需要看啦,如果需要用呢就请继续耐心看下去哦,这里先写一个不需要用nginx的方法吧,这里注意可以把Django项目setting中的DEBUG改成False咯,还有这里ALLOWED_HOSTS = ['*']修改一下
项目部置在软件开发完毕后,将开发机器上运行的开发板软件实际安装到服务器上进行长期运行,用 uwsgi 替代python3 manage.py runserver 方法启动服务器,使用 python manage.py runserver 通常只在开发和测试环境中使用,当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用uWSGI,uWSGI是WSGI的一种,它可以让Django、Flask等开发的web站点运行其中
让我们来到项目的目录下 cd 项目文件夹,创建一个名字叫做uwsgi.ini的文件吧
[uwsgi]
#Http通信方式的 IP地址:端口号
http=127.0.0.1:8000
#项目当前工作目录
chdir=/home/ubuntu/project/movie2.0/movieserver ... 这里需要换为项目地址
#项目中wsgi.py文件的目录,相对于当前工作目录
wsgi-file=movieserver/wsgi.py
进程个数
process=4
每个进程的线程个数
threads=2
服务的pid记录文件
pidfile=uwsgi.pid
服务的目志文件位置
daemonize=uwsgi.log
好啦,当我们配置完成这个文件以后就不需要像以前一样在终端中输入python3 manage.py runserver来启动一个项目啦,这里就直接启动uwsgi文件就好啦,那么我们来到项目目录下吧
启动uwsgi
sudo uwsgi --ini uwsgi.ini
停止uwsgi
sudo uwsgi --stop uwsgi.pid
说明:当uwsgi 启动后,当前django项目的程序已变成后台守护进程,在关闭当前终端时此进程也不会停止
在浏览器端输入http://127.0.0.1:8000 进行测试,uwsgi还有很多很多的功能,这里就不一一介绍啦~哈哈
**注意,此时端口号为8000
8.好啦,这样我们的服务器差不多就布置完成了,但是我们的网站总有一个端口号让我们感觉比较差呢~那就让我们来布置一下新的东西,那就是nginx 反射代理
Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理、负载均衡、缓存等一系列重要特性,在实践之中使用广泛。因为它是C语言编写,所以执行效率高。
nginx 作用
**负载均衡, 多台服务器轮流处理请求
反射代理
原理:客户端请求nginx,再由nginx 请求 uwsgi, 运行django下的python代码
uwsgi配置
这里因为我这个小项目是用了前后端分离来实现的,所以正好一个用到了nginx,这里就来写一下我的nginx配置,这里一样cd到项目目录下来创建一个uwsgi.ini的文件,然后用vim打开
这里我就不再复述很多uwsgi的配置了,就是需要注意把HTTP那一行改成socket
修改项目文件夹/uwsgi.ini下的Http通信方式改为socket通信方式,如:
[uwsgi]
# 去掉如下
# http=127.0.0.1:5000
# 改为
socket=127.0.0.1:5000
nginx配置
修改nginx 的配置文件 /etc/nginx/sites-available/default
# 在server节点下添加新的location项,指向uwsgi的ip与端口。
server {...server_name xxx.xxx.xxx.xxx;#这里就可以写你的公网IP或者域名咯
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
uwsgi_pass 127.0.0.1:5000; # 重定向到127.0.0.1的8000端口
include uwsgi_params; # 将所有的参数转到uwsgi下
}
location /static {
# root static文件夹所在的绝对路径,如:
alias /home/ubuntu/project/movie2.0/movie/static; # 重定向/static请求的路径,这里改为你项目的文件夹}
...}
这里要注意一定要注释掉try_files $uri $uri/ =404;这句话哦,然后还有在location的后面和 / 的后面都是有空格的哦,千万注意要加上哦,还有static上面也是有的哦
启动 nginx
$ sudo /etc/init.d/nginx start
或
$ sudo service nginx restart
查看nginx进程
$ ps aux | grep nginx
或
$ sudo /etc/init.d/nginx status
或
$ sudo service nginx status
停止nginx
$ sudo /etc/init.d/nginx stop
或
$ sudo service nginx stop
重启nginx
$ sudo /etc/init.d/nginx restart
或
$ sudo service nginx restart
9.好啦,万事大吉啦,那么就让我们来重启和启动uwsgi和nginx吧,这里要注意修改前端html中带有http协议的地址,把地址【127.0.0.1:5000 更换 公网IP】(这里注意连端口号都不需要了哦),铛铛,结束啦~
这里加上我最爱的座右铭
Nothing is impossible to a willing heart!