前不久写了个小的博客项目,想着将它部署到服务器上去,因为是第一次部署项目,有很多的东西都不这么懂,走了很多的弯路,现在部署成功了,怕以后忘记了就记录下笔记
首先我的项目结构如下:
关于服务器的远程连接,我用的服务器是阿里云的轻量应用服务器,连接数据库的软件通过WinSCP来连接我的服务器
这里我将我的服务器重置为CentOS 7.3 ,系统重置后原来的密钥还存在,但是不能通过验证,重新再获取密钥然后通过puttygen.exe软件来转为 .ppk 私钥文件。这部分操作参考:远程连接到Linux操作系统实例,
WinSCP连接成功后
通过ctrl+p来打开putty,前提得安装了putty,在putty中进行命令安装。
yum install epel-release
yum update
yum install nginx
systemctl start nginx #启动
systemctl stop nginx #停止
systemctl restart nginx #重启
systemctl status nginx #查看运行状态
systemctl enable nginx #开机启动
如果出现启动后无法通过IP访问,需要进一步设置防火墙:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
nginx的启动和关闭
pkill -f nginx #关闭
nginx #启动
绿色状态就是启动成功
总之,在浏览器输入你的服务器公网IP能出现下面页面应该就是成功的
不同CentOS的系统安装的MySQL包是不同的,我的Centos系统是7.3版本的,所以安装的版本是el7
EL6 is the download for Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x.
EL7 is the download for Red Hat 7.x, CentOS 7.x, and CloudLinux 7.x.
从MySQL Yum 仓库:http://dev.mysql.com/downloads/repo/yum/下载合适自己电脑版本的rpm包。
1、yum仓库下载MySQL:sudo yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
2、yum安装MySQL:sudo yum install mysql-community-server
3、启动MySQL服务:sudo service mysqld start
4、检查MySQL服务状态:sudo service mysqld status
5、查看初始密码(如无内容直接跳过):sudo grep 'temporary password' /var/log/mysqld.log
6. 更改密码:
建议直接 vim /etc/my.cnf ,在配置文件中添加 skip-grant-tables(跳过密码验证,需要重启mysql服务),然后再 mysql -u root -p 登录
use mysql;
---> update user set authentication_string='' where user='root';(将root密码置空)
--->删除my.cnf中的skip-grant-tables --->service mysqld restart(重启MySQL服务)--->登录MySQL
--->mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'Root123!';(密码太简单不会通过)
修改配置文件:
vim /etc/my.cnf
[mysqld]
# 添加编码配置
character_set_server=utf8
init_connect='SET NAMES utf8'
# 设置外部IP可以访问
bind-address = 0.0.0.0
以前可以直接使用:GRANT ALL ON *.* TO 'root'@'%';授权root用户的所有权限并设置远程访问,但是新版本MySQL将创建用户和赋值权限的方式分开了,所以执行: GRANT ALL ON *.* TO 'root'@'%'; 会提示:ERROR 1410 (42000): You are not allowed to create a user with GRANT
解决方法:
1,为MySQL创建用户:rong, 密码为:
CREATE USER rong IDENTIFIED BY 'Root123!';
2,给用户授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='rong';
关于使用Navicat等可视化工具连接MySQL时会提示2059错误,这是因为 MySql8.0版本和旧版本的加密规则不一样,刚刚测试发现没有改加密规则Navicat好像也能直接连接阿里云的MySQL,可能是后面最新版本的Navicat可能升级了加密规则,可以直接连接MySQL8.0版本
使用Navicat等可视化工具连接时输入用户,密码,会提示2059错误,这是因为 MySql8.0版本和旧版本的加密规则不一样,
而现在的可视化工具只支持旧的加密方式,所以需要更改MySQL8.0用户登录的加密规则:mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 更新root用户密码
CentOS7的默认防火墙为firewall,默认是不打开的。
systemctl start firewalld #启动friewall
systemctl status firewalld 查看firewall启动情况
firewall-cmd --zone=public --add-port=3306/tcp --permanent 开启3306端口
firewall-cmd --reload #重启防火墙
firewall-cmd --list-ports #检查打开的端口
对了,如果用的阿里云服务器还需要到控制台开启对应的端口(3306),不然还是连接不上MySQL
Centos7默认安装的是python2.7.5,我们可以通过 python -V来查看pyhton版本,然后使用命令 which python 查看一下Python可执行文件的位置。
安装相关包,增加编译功能,防止安装python出现各种异常
1.安装相关包:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
2.编译安装python3:
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
3.解压:tar -xvJf Python-3.6.7.tar.xz
进入到解压后的目录: cd Python-3.6.7
4.编译安装:
./configure prefix=/usr/local/python3
make && make install
添加软连接:
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
安装pip3
将之前安装的python3中的pip3添加上软连接就可以:ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
通过 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz 来下载安装包,中间最好不要有断网的,不然后面进行编译安装可能会出现问题
更新pip:
pip install --upgrade pip(默认更新python2的pip)
pip3 install --upgrade pip 更新python3的pip
1,安装安装virtualenv
pip install virtualenv #安装到python2中
pip3 install virtualenv #安装到python3中
2,安装virtualenvwrapper
pip install virtualenvwrapper #安装到python2中
pip3 install virtualenvwrapper #安装到python3中
需要注意的是这两个都得装,如果只装python3的话,workon命令是用不了的。
3,查找位置:
find / -name virtualenvwrapper.sh
4,编辑配置文件
cd~ --> vim ~/.bashrc
添加下面两个命令到最后,用来指定虚拟环境的位置。
export WORKON_HOME=~/.virtualenvs
source /usr/local/python3/bin/virtualenvwrapper.sh
执行.bashrc使文件生效: source ~/.bashrc
5,创建虚拟环境
mkvirtualenv -p /usr/bin/python3 env_name (最后的env_name为虚拟环境的名称)
创建完虚拟环境后通过下面命令导出我们的项目依赖的包(在pycharm中执行),然后在安装
pip freeze > requirements.txt # 导出项目依赖的包名到文件中
在虚拟环境中安装requirements.txt文件中所有的包(requirements.txt文件通过WinSCP软件上传到CentOS上去)
通过workon命令就可以查看所有虚拟环境的目录,workon env_name 进入该虚拟环境, deactivate退出虚拟环境,(删除虚拟环境:rmvirtualenv 虚拟环境名)
在CentOS的python虚拟环境中下载这些依赖包:pip install -r requirements.txt
错误一:
出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*解决办法
解决:easy_install -U setuptools
错误二:
安装mysqlclient时可能会出错,显示OSError: mysql_config not found,mysql_config 找不到,
所以导致mysqlclient安装不上,centos需要再安装下面这些依赖就可以有mysql_config了.
解决:yum install mysql-devel gcc gcc-devel python-devel
pip install uwsgi
将Windows中的项目文件通过winscp上传到Linux中,这里将项目文件直接放到root目录下,然后在 /root/Django_blogs/ 目录下新建一个文件夹conf, Django_blogs是我的项目文件。
[uwsgi]
chdir = /root/Django_blogs # 项目路径
module = Django_blogs.wsgi
master = true
processes = 5
socket = 127.0.0.1:8000
vacuum = true
virtualenv = /root/.virtualenvs/blog_py3 #虚拟环境地址
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
listen 80;
server_name 47.107.**.222 www.rongdang.top ; # 你的IP地址和备案后的域名
charset utf-8;
client_max_body_size 75M; # adjust to taste
location /media {
alias /root/Django_blogs/media/; # 指向django的media目录
}
location /static {
alias /root/Django_blogs/blog/static/; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']
# 静态文件路径
STATIC_URL = '/static/'
STATIC_ROOT = (os.path.join(BASE_DIR, 'blog/static'))
# 媒体文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Djnago_blogs/urls.py
from django.views.static import serve
from Djnago_blogs.settings import STATIC_ROOT, MEDIA_ROOT
urlpatterns = [
# 静态文件和媒体文件访问处理函数,如果不添加,在生产环境下则无法访问静态文件和媒体文件
re_path(r'^static/(?P.*)/$', serve, {'document_root': STATIC_ROOT}),
re_path(r'^media/(?P.*)$', serve, {'document_root': MEDIA_ROOT})
]
在url.py文件中一定要添加静态文件和媒体文件访问处理函数,如果不添加的话,运行项目时,即使你的路径是正确的也加载不出对应的静态文件。
将nginx配置文件添加到nginx的启动配置文件中
ln -s /root/Django_blogs/conf/my_nginx.conf /etc/nginx/conf.d/
如果nignx下没有 conf.d 文件夹则添加一个就是了。
cd到项目路径,搜集所有的静态文件到static下,包括admin中的。
python manage.py collectstatic
最后通过Navicat,将Windows数据库中的数据传输到阿里云服务器的数据库中(点击工具-->数据传输)
settings.py中的数据库连接也需要修改,因为密码不一样了。
修改nginx用户为root用户: vim /etc/nginx/nginx.conf 修改第一行用户为root用户,然后 pkill -f nginx 关闭nginx,nginx 启动nginx
最后启动uwsgi就可以通过域名看到我们的网站了。最后加 & 代表后台运行
uwsgi -i /root/Django_blogs/conf/uwsgi.ini &
关于使用uwsgi测试运行
可以使用uwsgi的http协议访问自己django写的网站,例如:
uwsgi --http :8000 --chdir /root/mysite --home /root/mysite_env --module mysite.wsgi:application
/root/mysite --> 指定项目所在路径, /root/mysite_env --> 指定项目的虚拟环境 ,这里mysite为我们的项目名
注意:如果是在系统环境中运行该代码,系统环境中要有项目所有的python包,这里我是进入虚拟环境中运行。
这样测试运行的话静态文件什么的应该是找不到的,例如我的 1.jpg 图片在 /static/img 下,通过上面一段代码运行则显示出来的图片路径在 /static/css/img/1.jpg 但是不用关心,只要程序能运行就行,然后我们通过 uwsgi -i /root/Django_blogs/conf/uwsgi.ini
运行项目后,那些问题就不会存在了,路径也能访问正确。
参考:https://blog.csdn.net/geerniya/article/list/3, 这位博主的文章给我提供了很大帮助