您的位置:首页 > 运维架构 > Nginx

uwsgi+nginx将django项目部署到ubuntu16云服务器上线及遇到的问题+内网部署情况提示

2020-08-28 17:06 1126 查看

最近将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重启一下一般就好了。

内网服务器上线项目的部署

大体上和外网的部署方式一致,但是需要注意的是,好多东西依赖啥的需要手动离线安装,会遇到很多很多的问题,最好的解决办法就是联系提供内网服务器的客户,帮助开通一下这个内网服务器访外网,应该是在他路由管理那里可以设置。

如果对您有帮助,赏口饭吃❤谢谢老板❤

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: