自己在云服务器搭了个小项目,把过程和踩的坑都记录下来。
操作系统:centOS 7
python版本:3.7.4
Django版本:2.2
mysql版本:5.7
还有:uwsgi + nginx
目录
一、服务器环境的搭建
(1)更新系统软件包
(2)安装软件管理包和可能使用到的依赖
(3)安装python3
(4)安装 django
(5)安装 uwsgi 和 虚拟环境
1.安装 uwsgi
2. 安装virtualenv
3.在虚拟环境里再安装一次 uwsgi
(6)安装 nginx
(7)安装mysql
1.下载 rpm 包
2.mysql版本的选择和修改
3.正式安装 mysql
4. 修改数据库的默认密码
二、将本地项目搬迁到服务器上
(1)导出项目依赖txt文件
(2)本地的项目打包,上传到云服务器
(3)解压项目,安装依赖
三、配置nginx代理转发和uwsgi
1.配置nginx
2. 配置uwsgi
yum update -y
上面那一步执行完了之后,接着按顺序执行以下命令
yum -y groupinstall "Development tools"
yum install yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
这一步完成之后,系统的配置就完了。接下来开始项目的搭建。
linux主要是用命令行操作的,常用的文件操作命令:
ls // 用于显示当前目录下的所有文件和文件夹
cd // 进入文件夹,如: cd /usr/home
// 特殊的: cd / 是回到根目录下, cd ../ 是返回上一层
mkdir + 文件名 // 创建文件夹, 如:mkdir test (命令和内容中间要加空格)
rm + 文件名或者文件夹名 // 删除文件或者文件夹
// 文件 rm -f /usr/local/log.txt -f是直接强行删除的意思
// 文件夹 rm -rf /usr/local/test -r是不管里面有多少级目录都删除
进入 local目录
cd /usr/local/
下载python3的安装包
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
完毕之后解压
tar -zxvf Python-3.7.4.tgz // 注意Python是大写开头
解压完成之后,在当前目录会生成对应的文件夹,可使用 ls 查看,然后进入到刚才解压的文件夹里
cd Python-3.7.4
编译到指定的路径(路径可自己指定,但是要记得)
./configure --prefix=/usr/local/python3 // 后面的路径自己一定要记得, 后面需要和这里保持一致
这里 ./configure --prefix的意思是将该软件安装在 /usr/local/python3 下面。
make 执行编译
make install 执行安装
make clean 清除产生的临时文件
ln 创建软连接,相当创建快捷命令,可以直接调用
然后按顺序执行命令安装python3,此时的还是在 Python-3.7.4的目录下进行的。
编译并安装
make && make install
完成之后,建立一下软链接,这里的/usr/local/python3/就是上面指定好的路径了。这样就可以在终端中使用python3命令啦!
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
完成之后,检查一下 pip3 是否安装完成,并且一定要检查版本,pip3的版本号要和你本地项目的pip3版本要一致,或者高于本地的版本。否则可能会导致它不能去下载一些你在使用的依赖包。可以使用 -V 去查看对应的程序版本号。
可以看到,python3 和 pip3 的版本号分别为:3.7.4 和 20.0.2 和我本地使用的是一样的。
注意一点:centOS系统是自带了python的,版本可以自己查看,千万不要把他卸了!第一次搭建的时候,我脑抽把python卸了,就因为它和我的python3我觉得会冲突,但没想到它是yum的依赖。
pip3 install django==2.2 // 指定django的2.2版本
安装完成之后,可以查看一下版本号是否正确
pip3 install uwsgi
// 完成后建立软链接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
接着,用cd命令返回到根目录下
创建两个新的文件夹,一个用于运行虚拟环境,一个用于存放自己的项目
mkpir -p /myself/virtual/ // 虚拟环境
mkpir -p /myself/website/ // 项目目录
virtualenv用于创建虚拟环境,用来进行不同版本的项目管理
pip3 install virtualenv
建立软链接
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
进入到 /myself/virtual/ 目录下,创建虚拟环境
virtualenv --python=/usr/bin/python3 pyweb
完成之后会生成一个 pyweb文件夹,然后进入到文件夹里面,再进入 bin 文件夹里,启动虚拟环境:
source activate // 退出虚拟环境的命令为 deactivate
看到如下,就已经启动了虚拟环境:
即系统上安装一次,在虚拟环境里也安装一次。
pip3 install uwsgi
找到一个目录,这里用的是home目录,下载nginx
wget http://nginx.org/download/nginx-1.13.7.tar.gz
下载完之后,解压:
tar -zxvf nginx-1.13.7.tar.gz
用 ls 看一下解压完成之后的文件夹,然后进入到文件夹里,依次执行
./configure
make && make install
nginx安装好了以后,一般默认的路径为/usr/local/nginx。
同样,这里还是进入 home 目录下(就是上面下载nginx的那个目录,可以自己指定别的),下载mysql
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
注意,这是一个 rpm 的包,使用如下命令安装
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
安装完了之后,就可以使用yum去安装mysql了。
在yum库中,有多个版本的MySQL,一般都是默认最新版本的mysql,其它版本的是禁用的。但是我们可以通过下面的命令来查看,有哪些版本。
yum repolist all | grep mysql
然后就可以看到下面的内容:
可以看到现在支持的mysql版本,并且8.0是属于enabled启用状态(红色部分),如果我们想要安装8.0版本直接安装即可。不过现在我们要安装的是5.7版本的,所以我们需要修改一下配置文件。
vim /etc/yum.repos.d/mysql-community.repo
用上面的命令打开配置文件之后,找到5.7 和 8.0
按下键盘上的INSERT键 ,光标移动到5.7下面的enabled=0改为enabled=1,把8.0的enabled=1修改为enabled=0。然后按下键盘ESC,输入 :wq 回车,就保存了编辑之后的配置文件。然后,我们可以验证一下状态
yum repolist enabled | grep mysql
sudo yum install mysql-community-server
安装成功之后,启动Mysql:
sudo service mysqld start
结果:
然后查看一下启动状态:
sudo service mysqld status
说明启动成功了。
mysql在启动的时候,自动进行了初始化。密码比较复杂,建议修改一下,你能记住也行
通过命令:
sudo grep 'temporary password' /var/log/mysqld.log
可以看到系统默认的登录密码:
然后再输入命令:
mysql -u root -p
输入前面红圈圈起来的初始密码登录之后,再输入以下的命令:BY 后面跟着的是你自己修改后的密码
注意:密码必须是 大小写字母、数字、和特殊符号混合,不然会提示不符合要求。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NanFenggood.520';
mysql全部安装完毕!!!
在本地的项目目录下,就是可以看到manage.py的那一层,调出控制台,输入命令:
pip freeze > requirements.txt
我是通过控制台的 scp 命令(好像是win10内置的,不知道10以下有没有)把文件上传到服务器的,要是有别的什么更好用的方式也可以交流一下嗷(secureCRT?Xshell?)。我暂时是这么用的...
// scp -r 需要上传的文件所在的路径 root@服务器的公网ip:上传到那个文件夹下
// 如:
scp -r D:/PythonTest/freeSite.zip root@服务器的公网ip:/myself/website
这里应该是会有个提示的,具体内容忘记了,大概是生成一个密钥之类的,yes一下就好了
然后输入登录服务器的密码。就上传成功了
如果后期重置了自己的服务器,这里再使用scp命令传输文件的时候,会报错,因为密钥不一致了。
密钥在本地:C:\Users\你电脑的用户名\.ssh\known_hosts 里
打开文件可以看到某一行有自己的服务器ip地址,还有后面一长串奇奇怪怪的东西
这一行直接删掉,然后再去重新执行一下scp命令就好了
cd /myself/website/ 进入到压缩包所在目录,解压
unzip freeSite.zip // 后面是你自己项目压缩包的文件名
然后cd进入到项目文件夹目录下,安装依赖
pip3 install -r requirements.txt
如果不报错,皆大欢喜,如果报错了(反正我自己在安装的时候就报错了),大概报错的是:
complate output from command python setup.py egg_info
.......
OSError: mysql_config not found
原因是linux需要mysql相关的一些依赖包,安装一下:
yum install mysql-devel gcc gcc-devel python-devel
这几个依赖安装完成之后,再重新安装requirements.txt里的依赖就好了。
如果还报错,错误里有 mysqlclient 这类的字样,应该就是只是mysqlclient版本资源的问题,实在不行,安装的时候,指定一下mysqlclient版本号再试试。
由于我是自己在本地新写的项目,再部署上去的,数据库没什么东西,只需要在服务器上新建一个同名数据库,然后在项目目录下执行下面的命令,更新一下模板就好了。
python manage.py makemigrations
python manage.py migrate
把settings.py文件里面的数据库配置一下,把账号和密码还有端口都填一下就好了。
再把settings.py文件里几个配置项修改一下:
1、关闭debug模式。
DEBUG = False
2、ALLOWED_HOSTS设置为* 表示任何IP都可以访问网站。
ALLOWED_HOSTS = ['*']
然后尝试着跑一下项目试一试。
python manage.py runserver
如果报错了,先排除看看是不是数据库的原因,找到项目下的 settings.py 文件,把里面DATABASES配置连接数据库的代码先注释掉 ,再运行一下,如果可以运行,那就是数据库的问题,再去处理。如果注释掉也不能运行,往上去找,看哪一步有问题。
如果成功运行,能够看到项目运行在那个地址和端口下,最后就只需要再配置一下 nginx 和 uwsgi 就可以让外网通过自己的服务器ip地址来访问项目了。
之前已经下载好了nginx,它被默认安装在了 /usr/local/nginx 下,现在进入到这个目录下,再进入到conf目录下,打开nginx.conf文件,把所有内容都删除,重新输入以下内容:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name 127.0.0.1:80; #有域名的话用域名, 没域名修改为127.0.0.1:80
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8050; #这里的端口要和后面配置uwsgi.xml里配置的一样
uwsgi_param UWSGI_SCRIPT freeSite.wsgi; #wsgi.py所在的目录名.wsgi
uwsgi_param UWSGI_CHDIR /myself/website/freeSite/; #项目路径
}
location /static/ {
alias /myself/website/freeSite/static/; #静态资源路径
}
}
}
配置的时候注意看后面的注释。配置完之后,进入到 /usr/local/nginx/sbin/ 目录下,执行命令:
./nginx
如果终端没有提示什么的话,就算是nginx启动成功。
我们可以通过 XML 文件来进行配置
进入到自己的项目目录下,就是有manage.py的那一层,创建一个 uwsgi.xml 文件,输入一下的内容:
127.0.0.1:8050
/myself/website/freeSite/
freeSite.wsgi
4
uwsgi.log
保存,然后启动uwsgi
#启动uwsgl
uwsgi -x uwsgi.xml
#uwsgi有没有启动成功,可以用下面的命令查看
ps -ef|grep uwsgi
#如果想重启uwsgi,先使用下面的命令杀掉进程,再启动uwsgi
killall -9 uwsgi
看到如下这样的状态就是成功启动了的。
最后一步!
在阿里云服务器的实例安全组里,配置一下安全组规则,如下:
大功告成!!
文章比较长,可能会有不足的地方或者bug,还请多多指教,一起交流
虽然上面网站搭建成功了,但是在进行接口数据传输的时候,发生了向后台发送中文字符时无法写入数据库的问题,解决如下:
1. 登录mysql之后,通过命令 show variables like "%character%"; 可以查看当前使用的数据库的字符集,查看 character_set_server 字段是否是 utf-8;若不是则需要修改。(ps: 如果是,那就看下py文件首行是否声明了ecoding: utf-8 之类的)
2、找到 my.cnf 文件,然后在[mysqld]那一块的最下面添加一行:
character-set-server = utf8;3、重启数据库服务 service mysqld restart
4、修改表的字符集 alter table 表名 convert to character set utf8 collate utf8_general_ci;