- 为什么要部署到服务器上
- 连接服务器
- Nginx和uwsgi组合介绍
- 一.安装python3.7
- 二.maridb 和 redis
- 三.安装nginx
- 四.安装virtualenvwrapper
- 五.安装uwsgi
- 六.测试uwsgi
- 七.配置nginx
- 八.通过配置文件启动uwsgi
- 九.将该配置文件加入到nginx的启动配置文件中
- 十.拉取所有需要的static file 到同一个目录
- 十一.运行nginx
- 十二.访问
centos7 下通过uwsgi,nginx部署django应用
为什么要部署到服务器上
- 本地的IP是一个动态分配的IP地址
- 数据包转发问题(一个IP可以对应很多实体机)
连接服务器
- 如果有两天服务器,它们就可以使用私有IP连接,非常快
- 如果有一台的话就用公网IP
- Linux ssh命令
- Windows系统用xshell工具新建连接
Nginx和uwsgi组合介绍
- Nginx和Apache端口都是80,同时安装必须改端口号,Nginx性能更好,底层是异步IO
- 浏览器要访问Django,首先要经过Nginx把不同的需求转发uwsgi,uwsgi主要是拉起Django的
- Django本身能够运行是因为已经实现了一个简单的运行Django的web容器,但是不建议用它来部署生产环境,因为它不稳定,并发处理能力也很低,而uwsgi是用C语言写的性能更高
- web框架一般都不会完成跟Nginx交互的过程,一般都是用第三方的组件,Django只需要实现uwsgi的一些协议就行了
- Nginx不完成和Django的通信,它只管做端口的转发,uwsgi会监听端口
一.安装python3.7
- 安装依赖包
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ openssl-devel libffi-devel python-devel mariadb-devel - 下载python源码
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar -xzvf Python-3.7.3.tgz -C /tmp
cd /tmp/Python-3.7.3/ - 把Python3.7安装到 /usr/local 目录(Linux源码安装基本都需要这三个命令)
./configure –prefix=/usr/local
make
make altinstall #这一步比较耗时 - 更改/usr/bin/python链接(最近的centos中已经把python3去掉了,需要自己配置python3的全局命令指向python3的可执行文件)
ln -s /usr/local/bin/python3.7 /usr/bin/python3
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
二.maridb 和 redis
- 安装
sudo yum install mariadb-server - 启动, 重启
sudo systemctl start mariadb
sudo systemctl restart mariadb
进程查看 ps aux|grep mysql 设置安全规则 配置mysql的端口
正常到这里就可以进入mysql,但是我不能,因为需要密码,刚安装完的数据库谁知道密码是啥
- 设置bind-ip(就可以所有主机请求了)
vim /etc/my.cnf
在 [mysqld]下面加一行 bind-address = 0.0.0.0
E45: ‘readonly’ option is set (add ! to override)
- 设置外部ip可以访问
mysql -uroot
GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘Mm123456’ WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON . TO ‘root’@’localhost’ IDENTIFIED BY ‘Mm123456’ WITH GRANT OPTION;
FLUSH PRIVILEGES; #刷新权限
sudo systemctl restart mariadb #重启 - 设置阿里云的防火墙对外开放端口
Duplicate entry ‘%-root’ for key ‘PRIMARY’
MySQL错误:Can’t connect to(10060)
MySQL错误:Can’t connect to(10060)
MySQL错误:Can’t connect to(10060)
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111)原因是服务器的数据库服务没开
-
安装mysqlclient
centos 7:(前面已经安装过了不用再装了) yum install python-devel mariadb-devel -y ubuntu: sudo apt-get install libmysqlclient-dev 然后: pip install mysqlclient -
安装redis
yum install redis
service redis start
redis-cli -
数据传输,把本地数据库放到服务器上去
三.安装nginx
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
- sudo yum install epel-release
- sudo yum install nginx
- sudo systemctl start nginx
安装nginx时报错:No package nginx available.
安装nginx时报错:No package nginx available.
安装nginx时报错:No package nginx available.
CentOS 7安装nginx方法以及常见nginx命令和安装问题
RHEL/CentOS 7.x/6.x/5.x开启EPEL仓库
最后发现安装不上Nginx可能是因为我之前在宝塔工具里安装了Apache,端口号冲突,虽然我并不知道为什么报找不到包
四.安装virtualenvwrapper
- 安装环境
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
yum install python-setuptools python-devel
pip install virtualenvwrapper - 编辑.bashrc文件
vim ~/.bashrc export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh - 重新加载.bashrc文件
source ~/.bashrc
如果提示找不到文件的话就sudo find / -name virtualenvwrapper.sh
报错:/usr/bin/python: Error while finding module specification for ‘virtualenvwrapper.hook_loader’ - 新建虚拟环境
mkvirtualenv -p python3 mxonline - 进入虚拟环境
workon mxonline
退出虚拟环境 deactivate - 把项目上传到服务器,可以用pycharm里的tools->Deployment->Configuration
-
安装pip包
然后将requirements.txt文件上传到服务器之后运行:
pip install -r requirements.txt -
运行项目
python.manage.py runserver 0.0.0.0:8000 访问60.205.203.74:8000即可
五.安装uwsgi
pip install uwsgi
六.测试uwsgi
uwsgi –http :8000 –module MxOnline.wsgi
七.配置nginx
新建uc_nginx.conf
#the upstream component nginx needs to connect to
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 {
#the port your site will be served on
listen 80;
#the domain name it will serve for
server_name 你的ip地址 ; # substitute your machine's IP address or FQDN
charset utf-8;
#max upload size
client_max_body_size 75M; # adjust to taste
#Django media
location /media {
alias 你的目录/Mxonline/media; # 指向django的media目录
}
location /static {
alias 你的目录/Mxonline/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
}
}
八.通过配置文件启动uwsgi
新建uwsgi.ini 配置文件, 内容如下:
#mysite_uwsgi.ini file
[uwsgi]
#Django-related settings
#the base directory (full path)
chdir = /home/bobby/Projects/MxOnline
#Django's wsgi file
module = MxOnline.wsgi
#the virtualenv (full path)
#process-related settings
#master
master = true
#maximum number of worker processes
processes = 10
#the socket (use the full path to be safe
socket = 127.0.0.1:8000
#... with appropriate permissions - may be needed
#chmod-socket = 664
#clear environment on exit
vacuum = true
virtualenv = /home/bobby/.virtualenvs/mxonline
logto = /tmp/mylog.log
注:
chdir: 表示需要操作的目录,也就是项目的目录
module: wsgi文件的路径
processes: 进程数
virtualenv:虚拟环境的目录
workon mxonline
uwsgi -i 你的目录/Mxonline/conf/uwsgi.ini &
九.将该配置文件加入到nginx的启动配置文件中
sudo ln -s 你的目录/Mxonline/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
vim /etc/nginx/nginx.conf
把user nginx
改成user root
重新启动Nginx
sudo systemctl restart nginx
访问60.205.203.74
安装完NGINX 已经正常启动,用IP访问显示的是Welcome to CentOS?
CentOS 7 执行service iptables start出现redirecting to systemctl …Failed to …not loaded.
在浏览器中转到我的服务器时,它显示的是CentOS欢迎页面,而不是nginx。我该如何解决?
十.拉取所有需要的static file 到同一个目录
在django的setting文件中,添加下面一行内容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/") 运行命令
python manage.py collectstatic
十一.运行nginx
sudo /usr/sbin/nginx
这里需要注意 一定是直接用nginx命令启动, 不要用systemctl启动nginx不然会有权限问题
十二.访问
http://你的ip地址/
出现502就是uwsgi挂了