Django+Uwsgi+Nginx是一种常见的生产环境部署方式,下面将详细讲解如何实现该部署方式。
一、安装必要的软件
部署Django应用,通常需要安装以下软件:
- Nginx:Web服务器,负责处理HTTP/HTTPS请求;
- uWSGI:Web服务器网关接口,将Web服务器与应用程序连接起来;
- Supervisor:进程管理器,用于管理uWSGI及Django应用进程;
- Python:必须安装需要的Python版本和相关依赖库。
示例一:在Ubuntu系统中,通过apt-get来安装软件:
sudo apt-get update
sudo apt-get install nginx uwsgi uwsgi-plugin-python supervisor python3 python3-pip
示例二:在CentOS系统中,通过yum来安装软件:
sudo yum install epel-release
sudo yum install nginx uwsgi uwsgi-plugin-python supervisor python3 python3-pip
二、创建Django项目
在安装完必要软件后,需要创建Django项目,并将其部署在uWSGI服务器上。在此之前,确保已经安装pip并且使用pip安装了virtualenv,这样就可以在虚拟环境中创建Django项目。
步骤如下:
- 创建项目目录
mkdir myproject && cd myproject
- 创建虚拟环境
virtualenv env
- 激活虚拟环境
source env/bin/activate
- 安装Django
pip install django
- 创建并启动Django项目
django-admin startproject mysite
cd mysite
python manage.py runserver
如果运行成功,就可以在浏览器上访问 http://127.0.0.1:8000/ ,看到Django欢迎页面了。
三、配置uWSGI服务器
uWSGI服务器用于将Nginx服务器和Django应用连接起来。在此之前需要先激活虚拟环境。在Django项目的根目录下创建uwsgi.ini文件:
[uwsgi]
http-timeout = 3600
plugin = python
master = true
keep-alive = true
processes = 1
threads = 2
http-socket = 127.0.0.1:8001
virtualenv = env
chdir = /path/to/myproject/mysite
module = mysite.wsgi:application
vacuum = true
其中:
- http-timeout:定义uWSGI处理连接超时。
- plugin:定义使用的uWSGI插件。
- master:启用uWSGI主进程。
- keep-alive:保持uWSGI进程存活。
- processes:uWSGI进程数。
- threads:每个进程使用的线程数。
- http-socket:uWSGI监听的地址及端口。
- virtualenv:虚拟环境路径。
- chdir:Django项目根目录路径。
- module:Django WSGI应用程序的入口。
- vacuum:每个启动uWSGI的进程在退出时清理环境。
启动uWSGI:
uwsgi --ini uwsgi.ini
可以看到uWSGI已经成功启动,并开始监听8001端口。
四、配置Nginx
Nginx用于处理HTTP/HTTPS请求,从而为客户端提供服务。需要安装nginx后,配置Nginx反向代理,将客户端的请求转发到uWSGI后端服务。
示例一:创建mysite.conf
并配置Nginx
server {
listen 80;
access_log off;
server_name mysite.com;
location / {
uwsgi_pass 127.0.0.1:8001;
include uwsgi_params;
}
}
uwsgi_params
文件:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
# if django need,it should add to uwsgi_params
# uwsgi_param HTTP_AUTHORIZATION $http_authorization;
# uwsgi_param HTTP_COOKIE $http_cookie;
# uwsgi_param HTTP_USER_AGENT $http_user_agent;
示例二:配置Nginx支持HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name yourdomain.com;
access_log off;
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
uwsgi_pass 127.0.0.1:8001;
include uwsgi_params;
}
}
五、配置Supervisor
Supervisor用于管理uWSGI及Django应用进程。
示例一:创建/etc/supervisor/conf.d/mysite.conf
文件:
[program:mysite]
command=/path/to/uwsgi --ini /path/to/uwsgi.ini
directory=/path/to/myproject/mysite
user=username
process_name=%(program_name)s
autostart=true
autorestart=true
stderr_logfile=/var/log/uwsgi/mysite_err.log
stdout_logfile=/var/log/uwsgi/mysite_out.log
其中:
- command:以uWSGI配置文件启动服务。
- directory:Django项目根目录。
- user:启动进程的用户。
- process_name:进程名。
- autostart:随着Supervisor自动启动。
- autorestart:关闭进程时自动重启。
- stderr_logfile:标准错误文件路径。
- stdout_logfile:标准输出文件路径。
示例二:重载Supervisor进程
sudo supervisorctl reload
六、多实例并发部署
可以使用uWSGI开启多进程,以便同时处理多个HTTP请求。
示例:
[uwsgi]
http-timeout = 3600
plugin = python
master = true
keep-alive = true
processes = 4 # 启动4个进程
threads = 2
http-socket = 127.0.0.1:8001
virtualenv = env
chdir = /path/to/myproject/mysite
module = mysite.wsgi:application
vacuum = true
总结
通过以上步骤,我们已将Django+Uwsgi+Nginx的部署完成,并配置了Supervisor,使代码能够在生产环境中正确运行。我们可以根据项目需求进行优化。例如:
-
配置一定的缓存以提升应用性能
-
配置负载均衡以便处理庞大的流量
-
配置HTTPS以保证安全性
-
配置防火墙以保护应用免受恶意攻击
...等等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django+Uwsgi+Nginx如何实现生产环境部署 - Python技术站