Django部署到Nginx阿里云服务器(uwsgi协议)

Django、Nginx、uwsgi各是什么?
  • Django:它是一个开放源代码的Web应用框架,由Python写成。Django是基于Python的web框架中最有代表性的一位。许多成功的网站和APP都基于Django。此外,它的数据库默认设置为SQLite,无需另外安装,除非你要用其他数据库。

  • Nginx:它是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。优点:轻量,占有内存少,并发能力强。

  • WSGI(补充):它的全称是Web Server Gateway InterfaceWSGI不是服务器,python模块,框架,API或者任何软件。WSGI只是一种规范,描述web server如何与web application通信,在此可理解为描述Nginx服务器Django项目间的通信。要实现WSGI协议,必须同时实现web serverweb application

  • uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议。它与mod_wsgi相比的优点为:超快的性能。低内存占用(实测为apache2的mod_wsgi的一半左右)。多app管理。

本文测试环境如下:
  • 云服务器:阿里云Ubuntu16.04
  • python版本:3.5.2

一、必要软件的安装

1. 安装Django
pip install Django

如果你遇到了python2python3多版本管理的问题,比如pip安装时它没有将Django安装到你所希望的python版本下,可以先读下我的这一篇博文:使用virtualenv创建各版本python的虚拟环境

2. 安装Nginx
sudo apt-get update
sudo apt-get install nginx
sudo /etc/init.d/nginx start    # start nginx

注意要先执行sudo apt-get update,这条命令是同步 /etc/apt/sources.list 中列出的源的索引文件,相当于获取软件最新的状态,这样才能获取到最新的软件包。不执行update,有可能会提示无法定位到nginx

安装完成后,用电脑的浏览器访问服务器的公网ip地址,如果出现Nginx的欢迎页面(如下),则表示nginx运行正常。

果然我这里没那么顺利,出现了异常,无法访问到该ip(也许是被墨菲定律眷顾吧= =!)。

因此下边开始异常解决。如果在你的服务器上运行正常,则nginx运行正常,点击跳过异常解决部分。

2.1 nginx无法访问的解决办法
问题原因猜测:
  1. nginx没有监听80端口
  2. ubuntu服务器的防火墙没有开放80端口

以下将按照这两个猜想进行排查

2.2 查看服务器端口占用
netstat -nap | grep 80

其中:
netstat:查看网络系统的状态信息;
-a或–all:显示所有连线中的Socket;
-n或–numeric:直接使用ip地址,而不通过域名服务器;
-p或–programs:显示正在使用Socket的程序识别码和程序名称;


说明nginx确实在监听80端口,运行正常。

2.3 查看防火墙设置
#查看ubuntu的ufw防火墙状态
ufw status


结果发现ufw未激活,并没有启用。

了解到阿里云服务器有一个安全组规则设置,其作用可类比防火墙,可以控制端口的开放与关闭。

2.4 阿里云安全组规则配置

前往阿里云服务器的管理控制台,点击自己的云服务器–>更多–>网络和安全组–>安全组配置–>配置规则,发现规则里没有对外开放80端口。至此,问题原因已经被找出。

理所当然地,我们应该设置对外开放80端口。选择添加安全组规则,并如下图填写。

其中授权对象的0.0.0.0/0表示允许或拒绝所有的ip访问。我们搭建的个人服务器当然是希望让更多的人访问,因此选择允许所有ip。

配置完成后,再次在浏览器中访问服务器的公网ip,可以看到上述的Welcome to nginx!

3. 安装uwsgi
sudo pip install uwsgi --upgrade
4. 小结

经过上面的步骤,我们已经搭建好了需要的软件和环境。作为web servernginx也运行良好,现在它只是不知道该如何处理不同的url请求,这就要求我们将nginx、uwsgi、django项目通过配置文件关联起来

接下来我们就开始逐一配置。

二、进行项目配置

1. django项目

为了方便测试,我使用的是通过django-admin startproject mysite生成的一个模板项目工程“mysite”。

如果你对django创建app项目还不太了解,这里给出官方教程链接:https://docs.djangoproject.com/en/2.1/intro/tutorial01/ 。如果你对英语感到陌生,不用担心,在官方教程右下角可以将语言切换至中文。

项目工程mysite放置在/var/www目录下,www目录结构如下所示,比如settings.py文件的全路径为/var/www/mysite/mysite/settings.py

.
├── html
│   └── index.nginx-debian.html
└── mysite
	├── *uwsgi.ini
	├── *run.log
    ├── manage.py
    ├── mysite
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── *static
        └── *admin
#注:带*的表示我们即将要创建的文件

接下来,我们要部署静态文件,即把Django的静态文件(CSS, JavaScript, Images等)收集到一个static文件夹中。这步不需要你手动执行,你只需要打开上述settings.py文件,加入一行:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

并且

#找到下面这一行
#ALLOWED_HOSTS = []
#换成
ALLOWED_HOSTS = ['你的公网IP', 'localhost', '127.0.0.1']

其中你的公网IP请替换成实际的IP地址,这样才能通过公网访问到django应用。

然后执行:

#此命令在外部的mysite文件夹下执行
python manage.py collectstatic


接着,你就会发现static文件夹生成好了。

为什么要创建这个static文件夹?为什么我网站的admin后台管理页面样式全没了?

你可能已经通过manage.py来运行过django项目,并且访问过默认生成的admin后台管理界面,彼时理所当然是有样式的。
如果不创建static文件夹,当使用公网ip访问admin时,客户端将无法获取到django内置的这些静态文件,就会出现样式全无的情况,也就是第二个问题的原因。

2. 配置nginx文件
vim /etc/nginx/sites-available/default

别看这个default文件写了很多东西,其实带#的都是注释,把注释拿开后,我们关注的只有:

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /var/www/html;
	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name 119.23.69.193;  #第一处修改,此处改为你的服务器的公网IP
	location / {
		#以下3行是第二处修改
		include /etc/nginx/uwsgi_params;  #uwsgi_params是我们需要用到的文件
		uwsgi_pass 127.0.0.1:8000;	#将请求交由uwsgi处理,并传到127.0.0.1:8000
		#try_files $uri $uri/ =404;       
	}
	#####################第三处修改begin
	location /static {
		alias /var/www/mysite/static;	#请替换成自己实际的静态文件目录
		#这里会将请求转换成对alias指定的路径下的文件访问
	}
	#####################第三处修改end
}

请把你default文件按如上进行修改,总共有三处,请仔细查看。另外,请不要盲目复制粘贴
对于上述参数,现给出部分参数解释如下:

listen 80 default_server;:listen,即监听指令,此处监听80端口,且后面有一个参数 default_server。Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到监听了 default_server 的 节点来处理。

location / {}:表示捕捉server_name的根请求,比如我服务器的根URLhttp://119.23.69.193/ 。同理,/statichttp://119.23.69.193/static

uwsgi_pass 127.0.0.1:8000;:将请求转至本机的8000端口,不用担心阿里云安全组规则的设置,因为是本地的。

这份配置文件告诉nginx从文件系统里寻找static文件,并且将一些需要django代码介入的行为交由uwsgi来管理。也就是实现了从nginx–>uwsgi。

修改完成后,别忘了重启nginx:

sudo service nginx restart
3. 配置uwsgi文件

接下来,在外部的mysite(/var/www/mysite/) 新建一个uwsgi.ini文件和一个run.log文件,即我在www目录结构下提到的带*文件。

然后我们将以下内容添加进这个空的uwsgi.ini文件:

[uwsgi]
chdir = /var/www/mysite
module = mysite.wsgi
socket = 127.0.0.1:8000 
master = true         
daemonize = /var/www/mysite/run.log
disable-logging = true
pythonpath = /root/py3env/lib/python3.5/site-packages

chdir:它是你的项目的根目录,请自行替换成你自己的;
moudule 是你的入口wsgi模块,将mysite替换成你自己的项目名称;
socket 是通信端口设置;
master = true 表示以主进程模式运行;
daemonize 是你的日志文件目录,这个路径就是刚刚新建的run.log文件的路径;
disable-logging = true 表示不记录正常信息,只记录错误信息;
pythonpath 是你python的包的路径。由于我们使用了virtualenv环境,所以这里必须设置,请替换成你的实际路径。否则会报错:ImportError:No module named django.core.wsgi。

最后,不要忘记使得ini文件生效:

#在/var/www/mysite/目录下执行
uwsgi --ini uwsgi.ini

可以使用uwsgi --python-version命令查看uwsgi对应的python,如果不是virtualenv里的那个版本,请自行修正好。可参考:http://blog.51cto.com/leizhu/2065394

#如果要重载init文件,需要如下操作
 #查看到占用8000端口的当前的uwsgi
 netstat -nap | grep 8000

#kill掉当前的uwsgi
 kill -9 进程号

#再次运行
 uwsgi --ini uwsgi.ini

至此,就完成了nginx–>uwsgi->django项目的配置。其中nginx到uwsgi是通过本地端口8000来完成的,nginx进行转交,uwsgi来监听,最后导入相应的django模块。

写在最后

We’re done! 现在,你可以通过ip访问你的网站啦,比如我的:http://119.23.69.193/ 、又或者admin后台管理。

其实还是踩了蛮多坑才能写完这篇博文的哈哈哈哈,希望能对你有帮助呀!有什么问题欢迎留言询问。

我查看了下run.log,发现程序给出了不少调整和优化建议,看来之后要研究下这块,立个flag吧hhh!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: NginxuWSGI部署Django应用程序的两个重要组件。Nginx是一个高性能的Web服务器,可以作为反向代理服务器,将请求转发到uWSGI服务器。uWSGI是一个Web服务器网关接口,可以将Django应用程序与Web服务器连接起来。 要部署Django应用程序,首先需要安装NginxuWSGI。然后,将Django应用程序配置为uWSGI服务器可以识别的格式。最后,将Nginx配置为反向代理服务器,将请求转发到uWSGI服务器。 具体步骤如下: 1. 安装NginxuWSGI 在Linux系统中,可以使用包管理器安装NginxuWSGI。例如,在Ubuntu系统中,可以使用以下命令安装: sudo apt-get install nginx uwsgi uwsgi-plugin-python3 2. 配置Django应用程序 将Django应用程序配置为uWSGI服务器可以识别的格式。可以创建一个uwsgi.ini文件,指定Django应用程序的路径和其他配置参数。例如: [uwsgi] module = myproject.wsgi:application env = DJANGO_SETTINGS_MODULE=myproject.settings master = true processes = 5 socket = /tmp/myproject.sock chmod-socket = 664 vacuum = true 3. 启动uWSGI服务器 使用以下命令启动uWSGI服务器: uwsgi --ini uwsgi.ini 4. 配置NginxNginx配置为反向代理服务器,将请求转发到uWSGI服务器。可以创建一个nginx.conf文件,指定Nginx的配置参数。例如: server { listen 80; server_name example.com; location / { include uwsgi_params; uwsgi_pass unix:/tmp/myproject.sock; } } 5. 启动Nginx服务器 使用以下命令启动Nginx服务器: sudo service nginx start 完成以上步骤后,就可以通过访问Nginx服务器的IP地址或域名来访问Django应用程序了。 ### 回答2: Django是一个优秀的Python Web框架,可以快速、高效地开发Web应用程序。为了将Django应用程序部署到生产环境中,必须选择一个适合的Web服务器和应用服务器。nginxuwsgi是目前最流行的Web服务器和应用服务器之一。 部署Django应用程序通常需要使用一个Web服务器来处理用户请求,例如静态文件请求,以及一个应用服务器来处理动态请求和逻辑处理。nginx作为一个高性能的反向代理和Web服务器,能够提供快速的静态文件服务,并能够处理大量的并发请求。uwsgi则是一个WSGI应用服务器,用于处理Django应用程序的动态请求。 下面是nginxuwsgi部署Django的一般流程: 步骤一:安装和配置uwsgi 1. 使用pip安装uwsgi `pip install uwsgi` 2. 创建uwsgi配置文件 创建一个名为uwsgi.ini的配置文件。文件内容可以参考以下示例: ``` [uwsgi] chdir=/path/to/your/project module=project.wsgi:application home=/path/to/virtualenv/ master=True processes=4 socket=127.0.0.1:8001 vacuum=True ``` 配置文件中,chdir指定Django项目的根目录,module指定Django的WSGI接口,home指定虚拟环境的路径,master指定uwsgi是否以主进程方式运行(建议设置为True),processes指定子进程的数量,socket指定uwsgi监听的IP地址和端口号,vacuum指定uwsgi退出时是否清理UNIX套接字的文件。 3. 在命令行中启动uwsgi `uwsgi --ini /path/to/your/uwsgi.ini` 4. 测试uwsgi是否正常工作 可以使用浏览器或curl等工具访问uwsgi绑定的IP和端口。如果看到Django应用程序的欢迎页面,则说明uwsgi正常工作。 步骤二:安装和配置nginx 1. 使用apt-get或yum等包管理工具安装nginx `apt-get install nginx` 2. 创建nginx配置文件 创建一个名为myproject的配置文件。文件内容可以参考以下示例: ``` server { listen 80; server_name yourdomain.com; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8001; } location /static { alias /path/to/your/project/static; } } ``` 配置文件中,server_name指定nginx要监听的域名或IP地址,access_log和error_log分别指定nginx的访问日志和错误日志的路径,location /指定nginx如何处理动态请求,包括使用uwsgi_params配置文件和uwsgi_pass指令将请求转发到uwsgi服务器。location /static则指定nginx如何处理静态文件请求。 3. 启动nginx `service nginx start` 4. 测试nginx是否正常工作 可以使用浏览器或curl等工具访问nginx绑定的IP和端口。如果看到Django应用程序的欢迎页面,则说明nginxuwsgi已经正常工作,Django应用程序已经成功部署。 总结 以上就是使用nginxuwsgi部署Django应用程序的一般流程。我们需要先安装和配置uwsgi,然后配置nginx,最后启动nginxuwsgi,并测试应用程序是否正常工作。如果需要将Django应用程序部署到生产环境中,还需要学习更多的部署技巧和经验,例如负载均衡、安全加固等。 ### 回答3: Django是一款非常流行的Web框架,而NginxuWSGI则是常见的Web服务器和Python应用程序服务器。这三个工具可以结合起来,用于部署和运行Django应用程序。 首先,我们需要将Django应用程序部署到一台服务器上,例如Ubuntu或CentOS。我们可以使用Git等工具来完成此操作。同时,我们需要在服务器上安装Python虚拟环境。Python虚拟环境可以为每个应用程序提供独立的Python环境,从而避免干扰其他应用程序。安装虚拟环境后,我们可以使用pip来安装Django和其他依赖项。 接下来,我们可以使用uWSGI来作为Django应用程序的Python应用程序服务器。uWSGI支持多种协议,例如HTTP和WebSocket。我们可以使用以下命令来启动uWSGI: ``` uwsgi --http :8000 --module mysite.wsgi --venv /path/to/venv ``` 这里,我们使用“http”协议并指定端口号8000。我们还指定了Django应用程序的入口点,即wsgi.py文件。最后,我们指定了Python虚拟环境的路径。当我们运行此命令时,uWSGI将启动一个Web服务器,该服务器将使用8000端口来监听HTTP请求,并将请求转发给Django应用程序。 最后,我们可以使用Nginx来作为反向代理服务器,以将uWSGIDjango应用程序连接到外部Internet。Nginx支持负载平衡和HTTPS等特性。我们可以使用以下Nginx配置文件来配置反向代理服务器: ``` server { listen 80; server_name example.com; location / { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi.sock; } location /static/ { alias /path/to/static/; } } ``` 这里,我们定义了一个名为example.com的虚拟主机来监听HTTP请求。我们将所有请求转发到uWSGI服务器的Unix套接字上,该套接字默认为/tmp/uwsgi.sock。另外,我们还配置了一个用于提供静态文件的路径。 使用此配置文件后,我们可以启动Nginx服务器,从而将所有来自外部Internet的请求都转发到Django应用程序上。此时,我们就成功地使用NginxuWSGI部署Django应用程序,从而使其能够运行在Web服务器上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值