服务器首先是物理上的一台性能高、线路全、运行稳定的机器,分为私有服务器、公有服务器。
私有服务器:公司自己购买、自己维护,只布署自己的应用,可供公司内部或外网访问,成本高,需要专业人员维护,适合大公司使用。
公有服务器:集成好运营环境,销售空间或主机,供其布署自己的应用,适合初创公司使用,成本低。
常用的公有服务器,如阿里云、腾讯云、青云等,可按流量收费或按时间收费。服务器还需要安装服务器软件,此处需要uWSGI、Nginx
因为很多Linux是自带Python2版本,但没有Python3,我们需要提前安装Python3和pip3,项目中使用数据库存储数据,我在这里选择安装的是MySQL5.6版本,具体安装教程可以参考以下两篇文章
Linux(CentOS7)安装Python3和pip3并为pip换源
Linux(CentOS7)安装MySQL5.6
部署前需要关闭调试、允许任何机器访问,打开项目的settings.py文件
DEBUG = False
ALLOW_HOSTS=['*',]
在本机执行以下命令导出当前需要的所有包
pip freeze > plist.txt
因为我本机是windows,所以是pip命令
这里建议大家以后每创建一个项目,都使用
mkvirtualenv 虚拟环境名称
创建一个单独的虚拟环境进行开发,因为pip freeze
命令会列出此环境下安装的所有模块
通过ftp软件将项目代码和plist.txt文件上传到Linux
在linux下通过之前安转的pip3命令安装Django应用所需的所有包
pip3 install -r plist.txt
在生产环境中使用WSGI作为python web的服务器。WSGI:全拼为Python Web Server Gateway Interface,Python Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受。WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行。
项目默认会生成一个wsgi.py文件,确定了settings模块、application对象。
uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。uWSGI代码完全用C编写,效率高、性能稳定
安装uWSGI
pip3 install uwsgi
配置uWSGI,在项目目录下创建uwsgi.ini文件,配置如下
[uwsgi]
#使用nginx连接时使用
#socket=IP地址:端口号
#直接做web服务器使用
http=IP地址:端口号
#项目目录
chdir=项目目录
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=wsgi.py文件地址
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
启动
uwsgi --ini uwsgi.ini
若没有软连接则建立链接文件
ln -s /usr/local/bin/uwsgi /usr/bin/uwsgi
此时可以在本机通过刚才配置的IP:端口号
访问项目提供的主页
若访问失败可能是由于防火墙或uwsgi.pid文件中的进程id不正确,
防火墙可以使用
systemctl stop firewalld
关闭防火墙uwsgi.pid文件中的进程id不正确可以参考以问题解决标题下的内容。
查看进程
ps -ef | grep uwsgi
停止(访问成功无需执行此命令,此处为报错演示做铺垫)
uwsgi --stop uwsgi.pid
执行关闭命令时出现错误
# 命令
uwsgi --stop uwsgi.pid
# 错误信息
signal_pidfile()/kill(): No such process [core/uwsgi.c line 1695]
报错内容后边的数字会发生变化,根据自身情况灵活操作
查看uwsgi的进程pid
# 查看进程pid
ps -ef | grep uwsgi
# pid信息
root 1653 1 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1655 1653 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1656 1653 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1657 1653 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1658 1653 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1660 1653 0 09:38 ? 00:00:00 uwsgi --ini uwsgi.ini
root 1740 1616 0 09:45 pts/0 00:00:00 grep --color=auto uwsgi
其中第三列1653
为uwsgi服务器进程id
打开你的uwsgi.ini文件,查看pid文件路径
# 进入项目目录执行查看命令
cat uwsgi.ini
# 信息显示
...
pidfile=uwsgi.pid
...
打开uwsgi.pid文件,把文件里的数字改成查询到的1653
vim uwsgi.pid
1653
保存退出
根据自己服务器中uwsgi的pid为准
重启后uwsgi.pid文件会自动更新pid
继续执行重启(uwsgi --reload uwsgi.pid
)或停止(uwsgi --stop uwsgi.pid
)命令,如果还报错,继续从第一步重新操作
即本机可以使用IP:端口号
进行访问
将配置中启用socket,禁用http
[uwsgi]
#使用nginx连接时使用,真实服务器中IP地址为私网地址
socket=IP地址:端口号
#直接做web服务器使用
#http=IP地址:端口号
#项目目录
chdir=项目目录
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=wsgi.py文件地址
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
停止uwsgi服务,然后再启动uwsgi
uwsgi --stop uwsgi.pid
uwsgi --ini uwsgi.ini
使用nginx的作用主要包括负载均衡、反向代理:官方网站
下载nginx后放到桌面上,解压缩
建议本地下载后使用ftp上传至Linux
tar xvzf nginx-1.16.1.tar.gz
此处linux后的版本以自己下载的为准
进入nginx-1.16.1目录,依次执行以下命令进行安装
cd nginx-1.16.1 && ./configure --prefix=/usr/local/nginx-1.16.1
make && make install
默认安装到/usr/local/nginx/目录,进入此目录
cd /usr/local/nginx/
启动
/usr/local/nginx/sbin/nginx
查看进程
ps -ef | grep nginx
此时可以通过IP地址在本机访问Linux,显示为Welcome to nginx!
停止(无需执行此命令,在此作为了解)
/usr/local/nginx/sbin/nginx -s stop
启动与停止命令可以通过软链接的方式加入到/usr/bin/中
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
打开Nginx配置文件文件
vim /usr/local/nginx/conf/nginx.conf
在server节点下添加新的location项,指向uwsgi的ip与端口
location / {
#将所有的参数转到uwsgi下
include uwsgi_params;
#uwsgi的ip与端口
uwsgi_pass 127.0.0.1:8080;
}
示例
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
#将所有的参数类型转到uwsgi下
include uwsgi_params;
#uwsgi的ip与端口,需要与uwsgi.ini文件中的socket指定的ip与端口号一致
uwsgi_pass 192.168.230.128:8080;
uwsgi_connect_timeout 30;
client_max_body_size 75M;
}
#error_page 404 /404.html;
...
}
关闭nginx后再开启
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
此时打开浏览器,输入Linux的IP地址访问,看到的就是Django项目中的内容了
到这还没有结束,需要将Django所需的静态文件配置一下
所有的静态文件都会由nginx处理,不会将请求转到uwsgi
打开Nginx配置文件文件
vim /usr/local/nginx/conf/nginx.conf
在server节点下添加新的location项,用于处理静态文件
location /static {
alias /var/www/django/static/;
}
...
在服务器上创建如下目录
mkdir -vp /var/www/django/static/
修改目录权限
chmod 777 /var/www/django/static/
修改项目下的settings.py文件
STATIC_ROOT = '/var/www/django/static/'
STATIC_URL = '/static/'
收集所有静态文件到static_root指定目录
python3 manage.py collectstatic
按提示输入yes,收集文件
停止后再启动nginx服务
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
此时在本机通过Linux的ip地址就可以访问到完整的项目了
大功告成!!!