uwsgi+nginx将django项目部署到ubuntu16云服务器上线及遇到的问题+内网部署情况提示
最近将django项目部署到了云服务器,网上好多部署的都是弄到了服务器本地访问,并没有实现云服务器上线部署,如果您需要部署到云服务器上线,那么这篇文章或许能帮您解决这个问题。
刚接触服务器的部署会觉得很麻烦,什么uwsgi,什么nginx的,看着就头大,但是等部署完之后会发现真的很简单,思路就是把本地项目弄到服务器上,然后在服务器上装好所需环境直到项目能够正常运行后,就可以通过uwsgi+nginx部署上线了,最后客户输入提供的ip就可以访问(因为是http协议,所以有ip就可以,而这个ip在开服务器的时候就会提供)
云服务器的部署
新开服务器的初始环境部署
新开的服务器是很干净的啥也没有,所有要简单部署一下新开服务器的环境,这部分根据需要选择是否部署,参考文章:
新增服务器初始环境部署
项目导入服务器
我这里是mac笔记本,所以用scp就可以实现本地文件和服务器之间的文件互传,其他电脑系统请咨询查询本地和服务器的文件互传方法。
sudo scp -r 项目的绝对路径 服务器用户名@服务器ip:/要上传到服务器哪个路径位置
项目运行环境调试
这部分就是在服务器里面本地跑起来导入的项目,具体配置就看您自己了,我说几个注意事项:
1)现在的Ubuntu是自带python2和python3.5的,如果您的项目是python3的,且能用python3.5部署最好,只需要配一个pip3(默认的一般不会给装上pip3,如果有的话,可以跳过下面pip3 的安装),项目所需依赖就会迎刃而解(小技巧,可以在服务器外面即本机把项目所需模块生成requiremet.txt文件,服务器内部直接pip3装这个requiremet.txt就可以)
#查看pip3 pip3 -V #如果没有,就手动安装pip3 sudo apt-get install python3-pip
装好的pip3如果能用的话,就可以接着部署自己所需的环境了,注意pip3如果能用就不要升级,忽略它的提示,正常安装即可,如果timeout超时,就临时换源安装:
pip3 install pythonModuleName -i https://mirrors.aliyun.com/pypi/simple
2)如果您实在不想用自带的python3.5,那么我劝您习惯用这个自带的3.5不要尝试卸载他,装一个其他python3版本,因为您在卸载的时候会同时卸载掉和自带python3.5所关联的所有依赖,而这些依赖是系统所需的,卸载了之后您就离重装系统不远了。
当然如果还是没忍住卸载了也有补救措施:
1⃣️删除/usr/lib/python3/这个位置的dist-packages文件夹
2⃣️下载原python3.5的dist-packages文件夹:
地址:https://pan.baidu.com/s/1g9gbOEG1MSr-4T3xWW6wSw
提取码:5ygu
3⃣️将下载好的文件解压成文件夹直接上传到服务器的/usr/lib/python3/目录下
3)一般在ubuntu中的python3.5也有自己的想法,如果您通过pip3下载了相应的pythonModuleName后,执行"python3 manage.py runserver"报错找不到下载的pythonModuleName,那么可以尝试一下"python3.5 manage.py runserver",我就是这么解决的。
下载并配置uwsgi和nginx准备上线
1)下载uwsgi和nginx
sudo pip3 install uwsgi sudo apt install nginx -y
2)进入到项目目录下修改settings.py文件
cd 项目目录 sudo vi settings.py
配置文件需要修改的部分:
#如果没有ALLOWED_HOSTS,在最底部加上即可 ALLOWED_HOSTS = ['公网ip'] #在最底追加下面的,用于一会配置uwsgi的静态文件,即static STATIC_ROOT=os.path.join(BASE_DIR,"static/") #找到DBUGE=True,改为下面的,True和False的首字母是否大写我忘了,以实际文件为准 #这个的的修改是为了上线后更流畅,值为True表示的是开发模式 DBUGE=False
3)配置uwsgi_params,这个东西的目的是uwsgi和nginx建立连接,在项目根目录下执行
cp /etc/nginx/uwsgi_params . #在项目目录下执行,注意后面这个点儿别落下
4)项目根目录下执行下面命令,配置uwsgi.ini
sudo vim uwsgi.ini
[uwsgi] #与外界连接的端口号, Nginx通过这个端口转发给uWSGI #注意这里一定要这么写,不要想着改成自己的端口,按照我的配基本上就没问题了 #公网访问端口也不是在这里配,这样写只是为了和nginx建立连接 socket = 127.0.0.1:8010 #是否使用主线程 master = true # 项目在服务器中的目录(绝对路径) chdir = /home/kl/Desktop/manager_for_kailuan master=true # Django's wsgi 文件目录,相对于上面的chdir路径 wsgi-file = manager_for_kailuan/wsgi.py # 最大进程数 processes = 4 #每个进程的线程数 threads = 2 # 退出时自动清理环境配置 vacuum = true #目录下文件改动时自动重启 touch-reload = /manager_for_kailuan #后台运行并把日志存到.log文件,这个路径自己定,能找到就行,主要是存日志,j记得在你加的这个路径创建一个uWSGI.log daemonize = /home/kl/Desktop/manager_for_kailuan/manager_for_kailuan/uWSGI.log
5)创建一个nginx.conf文件,这样就不用改默认的了,避免发生错误,文件的位置放在/usr/share/nginx/,否则找不到
sudo vi /usr/share/nginx/nginx.conf
配置内容,注意仔细看注释的字,改动的地方还是挺多的
user root; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #这个是引入他的一些默认配置,可以注释掉 #include /etc/nginx/conf.d/*.conf; server { #这是nginx服务器监听端口,一定要是80,不能是其他的,因为80是允许http协议的,我们的目的也是借助http协议访问ip listen 80; #你的云服务器的公网ip地址,为了安全我这里不展示,改成自己拿到的公网ip server_name 27.128.xx.xx; charset utf-8; #你的项目存放的位置,不包括项目名 root /home/kl/Desktop/manager_for_kailuan; #指定首页,Django中可以设置,这里注释掉 #index hello.html; location / { #你的uwsgi_params位置 include /home/kl/Desktop/manager_for_kailuan/uwsgi_params; #同你前面配置的uwsgi的socket,这样就建立连接了 uwsgi_pass 127.0.0.1:8010; } #静态资源位置 location /static{ #访问/static就相当于访问下面的路径 alias /home/kl/Desktop/manager_for_kailuan/static; } } }
6)文件配好后,要加载一下配置文件内部的静态文件路径
1⃣️打开项目的settings.py文件
找到下面这一段,注释掉,如果不注释掉这一段,接下来的命令执行会报错
STATICFILES_DIRS = ( os.path.join(os.path.join(BASE_DIR, 'static')), )
2⃣️到项目的根目录下执行manage.py进行迁移静态文件目录
python3.5 manage.py collectstatic
3⃣️成功后记得把刚才注释掉的东西在注释回来!!!!
7)启动/测试配置的uwsgi和nginx服务和配置文件是否成功
1⃣️启动和测试uwsgi,当然还是要先进入到uwsgi.ini的文件目录,或者在下面文件前加入文件的绝对路径
uwsgi --ini uwsgi.ini
如果输出如下结果表示开启成功
[uWSGI] getting INI configuration from uwsgi.ini
2⃣️启动和测试nginx,这里要加上咱们自己配置的nginx.conf指向
测试部分如下:
#测试 sudo nginx -t -c /usr/share/nginx/nginx.conf
出现下面情况表示启动成功:
nginx: the configuration file /usr/share/nginx/nginx.conf syntax is ok nginx: configuration file /usr/share/nginx/nginx.conf test is successful
启动部分如下:
#开启之前我们先关闭系统自启的nginx sudo nginx -s quit #查看是否已经关闭 ps -ef|grep nginx #开启 sudo nginx -c /usr/share/nginx/nginx.conf
8)如果开着防火墙需要开放配置的这个80端口:
#查看防火墙状态,如果有开放的端口会显示出来,allow表示允许,deny表示拒绝 sudo ufw status #开放端口 sudo ufw allow 80
9)在浏览器下输入公网ip就可以进行项目访问了,至此上线就部署成功了
10)注意事项
1⃣️当上线后如果对项目进行改动,效果是不会实时展示出来的,需要关闭uwsgi,在启动执行一下uwsgi.int和nginx就可以了(启动方式在第七步里面)
关闭uwsgi有两种方式,一个是根据pid关闭进程在打开,一个是直接kill端口,我喜欢用第二种进行刷新:
#杀掉所有的uwsgi killall -9 uwsgi sudo uwsgi --ini uwsgi.ini#以配置文件打开nginx sudo nginx -c /usr/share/nginx/nginx.conf
2⃣️启动nginx的时候如果遇到,“Address already in use”,说明启动成功了,不用担心,项目可以正常展示,如果出现了错误,在关了nginx重启一下一般就好了。
内网服务器上线项目的部署
大体上和外网的部署方式一致,但是需要注意的是,好多东西依赖啥的需要手动离线安装,会遇到很多很多的问题,最好的解决办法就是联系提供内网服务器的客户,帮助开通一下这个内网服务器访外网,应该是在他路由管理那里可以设置。
如果对您有帮助,赏口饭吃❤谢谢老板❤
- 基于nginx和uWSGI在Ubuntu系统上部署Django项目
- ubuntu 14.04部署python项目(Nginx+uwsgi+django)
- Django+uwsgi+Nginx项目部署上线
- Ubuntu下Django+uwsgi+nginx项目部署
- Ubuntu+Django+uWSGI+Nginx部署Django项目
- Ubuntu + Nginx + uwsgi部署Django Web项目
- Ubuntu18.04部署Django项目(Nginx+uWSGI)
- 如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程
- nginx1.4.7+uwsgi+django1.9.2项目部署,liunx系统为ubuntu14.0.4
- 阿里云 Ubuntu 16.04+uWSGI+Nginx部署Django项目
- Ubuntu+nginx+uwsgi部署Django项目
- 解决nginx+uWSGI部署Django时遇到的static文件404的问题
- 基于Nginx和uWSGI在Ubuntu上部署Django项目
- django项目在uwsgi+nginx上部署遇到的坑
- django项目在uwsgi+nginx上部署遇到的坑
- django项目部署到云服务器上(nginx+uwsgi)
- Python3+Django+uwsgi+nginx部署及遇到的问题解决方案
- Django+uwsgi+nginx(Ubuntu:16.4)项目部署
- centos7下nginx+uwsgi部署django项目问题记录
- Ubuntu16.04下Nginx+uwsgi部署Django项目