数据打工者工作之余用Django写了个简单网站(主要是跟着教程写的),废话不多说直接开始吧,社会小透明介绍个啥!把自己实践过的整理出来,也防止以后还有类似问题一头雾水,有错的地方请大佬指导!
感谢搜索引擎,感谢CSDN各位大佬!以下是我的环境
首先将阿里云ubuntu镜像配置好,本地采用远程链接工具链接好root用户。
安装mysql,具体看这里
1.更新系统
apt-get update 【注意:要在root用户下】
2、安装mysql-server
apt-get install mysql-server
apt-get install mysql-client
apt-get install libmysqlclient-dev
3、使用如下命令查询是否安装成功:
sudo netstat -tap | grep mysql
重启mysql
/etc/init.d/mysql restart
登陆:
mysql -uroot -proot
1,命令行登录 mysql,输入用户名,密码
mysql -u root -p
2,切换到 mysql库
use mysql;
3,查看用户表,可以看到当前host是localhost,只允许本地访问
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| localhost | root |
+-----------+------------------+
1 rows in set (0.00 sec)
4,更新user用户表
mysql> update user set `host` = '%' where `user` = 'root' LIMIT 1;
5.分配所有访问权限,如果已分配过,该步骤可跳过
mysql>
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root密码' WITH GRANT OPTION;
# 我用这个
GRANT ALL PRIVILEGES ON *.* TO 'tom'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
可以直接创建一个user = 'tom'并且host=’%‘的用户,我也不知道为啥,反正很神奇。
6.强制刷新权限
mysql> flush privileges;
7.再次查看用户表,root用户的host变成%,即允许所有的ip远程访问,如果需要指定具体的ip,就写上具体的ip即可
mysql> select host,user from user;
+-----------+------------------+
| Host | User |
+-----------+------------------+
| % | root |
+-----------+------------------+
1 rows in set (0.00 sec)
#修改MySQL配置文件
1.使用命令netstat -an|grep 3306 查看端口监听状态,绑定了127.0.0.1,
只允许本地访问,需要修改配置文件。
我当前的版本是这样进的 vim /etc/mysql/mysql.conf.d/mysqld.cnf
2.修改mysqld.cnf,注释掉bind-address 127.0.0.1属性---改成#bind-address 127.0.0.1
3.重启mysql服务service mysql restart,再次使用命令netstat -an|grep 3306查看端口监听状态
后面就是修改云服务器安全组规则,不同云服务器不同入口,具体看相关云服务器文档或者搜索引擎看大佬。
1,安装curl,git
sudo apt-get install curl git-core
2,安装pyenv
curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
这个命令会把pyenv安装到当前用户的~/.pyenv目录下.(本文中为/home/tom/.pyenv)
3,环境变量配置
编辑文件 .bashrc ,将下面的代码添加至文件内容末尾
(本文中bashrc文件路径在/home/tom下,vim ~/.bashrc 可以编辑可自行对应到自己的路径)
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"
fi
或者
export PATH="/home/tom/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
修改后保存~
这段代码的作用主要是指明pyenv的位置,
以便以后可以直接在命令行里面运行pyenv命令。 保存在~/.bashrc 文件中是为了每次用户登陆后自动生效。
然后刷新环境变量
source ~/.bashrc
4,开始安装python
4.1 先安装依赖
sudo apt-get install make build-essential libssl-dev zlib1g-dev
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget
sudo apt-get install llvm libncurses5-dev libncursesw5-dev
4.2 安装python
pyenv install 3.6.6 -v
(注:这里install的时候最好加一个 -v,否则安装过程信息是不会打印在控制台的,
看上去就好像安装进度卡住了一样,首次安装可能会引起疑惑)
5,pyenv基本操作
查看有哪些版本
pyenv versions
切换系统默认python环境
pyenv global 3.6.6
卸载某个python版本
pyenv uninstall x.x.x
另外pyenv还有各种其他命令行操作,可自行搜索了解~
重新打开远程SSH窗口可能会遇到pyenv command not found问题,重新source一下.bashrc文件
或者查看解决方案:戳这里
创建一个虚拟环境
pyenv virtualenv 3.6.5 myweb
其中3.6.5是需要指定的python版本, myweb是虚拟环境的名称(随便起的~)
此时,虚拟环境已经创建完成并自动激活,最前面括号的内容是当前的虚拟环境
(myweb) tom@iZuf6ed1y......:~$
- 1,上传项目
在原来的django环境中 输入命令pip freeze > required.txt 会在当前目录生成本项目安装的所有依赖,
并写入到required.txt中,然后将需要部署的django代码上传服务器,上传方式我用的ftp。
描述一下我的办法,先用7-zip压缩整个项目目录为tar格式,然后再将压缩好的tar压缩成gzip格式,
用XSHELL或SecureCRT采用crtl+alt+F 可以打开ftp窗口,到自己/home/用户名 目录下拖进去就好了,
其他方法例如SCP貌似不需要打包,方法蛮多的自行选择。
- 2,项目文件和依赖安装
我的压缩包为django.tart.gz,接下来tar -zxvf django.tar.gz 会解压文件并在当前目录下生成文件夹django
进入虚拟环境 pyenv activate myweb (这个是虚拟环境名字,之前如果没退出的话应该还在),
输入cd /home/tom/django,如果已经在用户目录下就直接cd django。
然后输入pip install -r required.txt ,这样他会一行一行的进行依赖的安装。等待其安装完成。
测试django是否可以正常运行,进入manage.py 目录,
输入 python manage.py runserver 0.0.0.0:8000。
本地浏览器输入{阿里云公网IP}:8000 /(设置了url就写)
这个命令首先需要保证8000端口不被占用,如果占用那就换一个,也可以把8000端口占用的都kill掉,
不过这么粗暴我就不建议了,毕竟自己不懂,杀出问题就不好了,还有就是1024以下端口好像需要root用户才可以,
再有就是这个需要保证阿里云安全组8000端口开放。还有一个就是django下的settings.py中改一下
DEBUG = False # 关闭调试模式。
ALLOWED_HOSTS = ['*'] # 允许所有主机访问。
可能还有遗漏的以后继续补充。。
数据库新建一个原来项目同名的数据库,如原来数据库用的tom现在也在服务器上新建一个tom的数据库,
可以用可视化,可以用命令行,大佬随意。
然后进入项目目录
python manage.py migrate
ORM映射到数据库完事
pip install uwsgi
等待安装成功,应该基本应该可以安装成功 ,之前我一直出问题的是记得ssl问题 。
后来按照这个步骤来,在安装python的时候安装了足够的依赖应该问题不大。
#官网提供的代码
1 def application(env, start_response):
2 start_response('200 OK',[('Content-Type', 'text/html')])
3 #return ['Hello world'] # Python2
4 return [b'Hello world'] # Python3
保存后退出,输入uwsgi --http :8000 --wsgi-file uwsgi_test.py,值得注意的是http 和:8000之间有一个空格
后在本地输入公网IP:8000如果出现Hello world代表没问题。
[uwsgi]
#如果单独使用uwsgi来部署Django项目时,就用这一行。
#http=0.0.0.0:8000
#如果使用nginx+uwsgi来部署Django项目时,就用这行。
#其中,8001端口用来跟nginx通信。也要在阿里云防火墙中添加8001端口。
# socket=0.0.0.0:8001
#你项目的完整路径。
chdir=/home/tom/django
#给socket文件赋权限,这里不用管。
# chmod-socket=664
#启用主线程。
master=true
processes=4
threads=2
#指定日志文件(会自动创建)。这个很重要,如果uwsgi出现错误,可以通过日志文件来查错。
logto=uwsgi.log
#指定进程号文件(会自动创建)。这个也很重要,如果要重启和关闭uwsgi,则需要这个文件,里面记录了进程号。
pidfile=uwsgi.pid
#指定wsgi文件。在与settings.py同级目录中会有一个wsgi.py文件。
这里和settings.py里面的WSGI_APPLICATION是一样的,就是后面application前面是冒号“:”
--前面mydj是在创建django项目的时候那个startproject后面的名字。
module=mydj.wsgi:application
保存并退出,输入uwsgi --ini uwsgi.ini
可能会有的问题
1, 端口被占用,ps -ef |grep uwsgi 可以查看,然后kill -9 PID杀掉,再重新运行。一般是没有问题的了。。2, 还有可能就是配置文件有些东西没写,注意看错误提示,时刻准备着翻译软件。
一样的 公网IP:8000访问,正常访问就成功啦,现在静态文件还没有加载,后面采用nginx的时候就会有啦。
# 简单粗暴
sudo apt-get install nginx
#运行
sudo /etc/init.d/nginx start
如果出现sudo: unable to resolve host问题,参开这里
如果出现端口占用情况,通过修改配置文件换用其他端口(如8000),新环境一般是不会被占用吧 ,我一路丝滑通畅。
如果出现端口没被占用但无法访问,请回到云服务器配置安全组出查看端口策略是否配置完备
打开浏览器访问 xx.xx.xxx.xxx:80,其中xxxx是你的公网IP,80是Nginx默认监听的端口号
出现如下就成功啦
#首先在settings.py文件写入打包的目标路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# 保存退出,然后
python manage.py collectstatic
#会自动将我们项目的中采用static方式加载的静态文件打包到static文件夹中
修改nginx配置
这里我所搜索到内容就很多了,十分建议学好英语,以后咱们看官方文档吧,我反正被搞死了。
后面是我目前项目的中的写法 ,犯错误得话请大佬指出,非常感谢!!!
我这里nginx启动读取配置得是/etc/nginx/nginx.conf,我怕出问题,第一步备份
进入目录
cd /etc/nginx/
备份一个nginx.conf.bak
sudo mv nginx.conf ./nginx.conf.bak
然后 新建一个nginx.conf文件
sudo vim nginx.conf
键入如下内容
需要注意的是,是需要用分号;
结尾的
# myweb_nginx.conf
#下面都是本项目的路径,自己的路径按照样例配置哦
events{
worker_connections 1024; #这个反正我也不懂,后面在慢慢补充....
}
http{
# configuration of the server
server {
# the port your site will be served on
listen 80; # 监听的端口 就是那个浏览器访问xx.xxx.xxx:80 这个80
# the domain name it will serve for
server_name 0.0.0.0; # 可以填写你自己的域名
charset utf-8;
#后面这两行是配置log文件的输出位置,
#虽然我配置了,但是我在运行的时候发现在原来的那个默认位置他好像还需要输出?那就很尴尬了。
access_log /home/tom/myweb/config/nginx/myweb_nginx_access.log;
error_log /home/tom/myweb/config/nginx/myweb_nginx_error.log;
#这下面这个是当时配置好了之后 发现浏览器还是无法读取静态文件 借助搜索引擎才添加上,感谢大佬指导!
include mime.types;
default_type application/octet-stream;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media 读取你的meida静态文件
location /media {
alias /home/tom/myweb/meida;; # your Django project's media files - amend as required
}
#这个就是之前那个命令收集的static文件位置了
location /static {
alias /home/tom/myweb/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
# 这个就是指定uwsgi 将80端口收集到的请求转发给8001端口,欸,刚好uwsgi就在监听这个8001端口
# 这里的端口号可要和uwsgi中的配置文件的socke对准哦。
# 打开uwsgi 配置的socket = 0.0.0.0:8001的注释,并注释掉http那行
uwsgi_pass 0.0.0.0:8001
include uwsgi_params; # the uwsgi_params file you installed
uwsgi_read_timeout 30;
}
}
}
# 首先 看看之前nginx有没有关干净?先试试
sudo nginx -s stop
#然后
ps -ef |grep nginx # 如果还有 那就粗暴点kill -9 PID 干掉吧。
#接下来配置文件修改了,那我查看一下对不对?
sudo nginx -t #这个命令可以检查配置文件是否有问题。
#改都改了那重载一下?现在回来看下才发现这个其实是热重启,这执行了其实后面的启动可以不要执行了
sudo nginx -s reload
#然后指定配置文件位置启动
# sudo nginx -c /usr/nginx/nginx.conf
#然后咱们看看启动起来没有
ps -ef |grep nginx
#如果显示下面这样,那真的就是恭喜了!!!你真的启动成功啦!!!
root 30880 1 0 15:47 ? 00:00:00 nginx: master process nginx -c /etc/nginx/nginx.conf
nobody 30881 30880 0 15:47 ? 00:00:00 nginx: worker process
tom 31922 7458 0 23:17 pts/0 00:00:00 grep --color=auto nginx
以上就是这么几天爬坑进进出出的全过程,总结一下,防止以后再出问题。
参考的网址如下,感谢这些大佬的无私分享!!!!
Ubuntu下的Nginx + Uwsgi + Django项目部署详细流程
nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!
Nginx常用命令
阿里云服务器Ubuntu 16.04 3安装mysql
阿里云服务器MYSQL数据库开启远程访问
vim 操作命令大全
web页面 显示 Resource interpreted as Stylesheet but transferred with MIME type text/plain的错误警告
再次感谢大佬,努力学习,努力爬坑。
把自己犯的错记录下来,防止后面出问题没地方找,也希望可以帮到其他人!!