1. uWSGI 服务器

Django 默认使用 WSGI(Python Web Server Gateway )

作为 Web 服务器,一般仅用来作为测试使用,实际生产环境而是使用 uWSGI 和 Nginx 作为服务器。

uWSGI 代码完全用C编写,效率高、性能稳定,但是处理 静态文件能力较弱,因此实际生产环境中,一般采用 uWSGI + Nginx 两者搭配使用:

  • uWSGI:处理动态请求(css、js、图片文件等)
  • Nginx:处理静态文件请求(提交表单、mysql、动态渲染 html)

安装:

  1. pip3 install uWSGI

settings.py 配置

设置 ALLOWED_HOSTS

  1. ALLOWED_HOSTS = [
  2. # 加上本机的IP地址
  3. '192.168.xx.xxx',
  4. '127.0.0.1',
  5. 'localhost'
  6. ]

也可以这样设置:

  1. ALLOWED_HOSTS = ['*']

1.1 通过参数启动 uWSGI

  1. # 请更换成你服务器 ip 和端口,其中 Celery_Test/wsgi.py 为Django 项目中自带的 wsgi web 服务
  2. hj@hj:~/桌面/Celery_Test$ uwsgi --http 192.168.21.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static

出现如下效果便是运行成功了:

查看启动端口:

  1. hj@hj:~/桌面/Celery_Test/script$ ps -ef|grep uwsgi
  2. hj 17176 5231 0 15:37 pts/1 00:00:00 uwsgi --http 192.168.xx.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static
  3. hj 17177 17176 0 15:37 pts/1 00:00:00 uwsgi --http 192.168.xx.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static
  4. hj 17206 6554 0 15:38 pts/2 00:00:00 grep --color=auto uwsgi

访问 192.168.21.128:8080

1.2 通过配置文件启动 uWSGI

在项目根目录创建一个名为 uwsgi.ini 的配置文件,配置如下:

  1. [uwsgi]
  2. # 项目目录
  3. chdir=/home/hj/桌面/Celery_Test/
  4. # 指定项目的application
  5. module=Celery_Test.wsgi:application
  6. # 指定sock的文件路径
  7. socket=/home/hj/桌面/Celery_Test/script/uwsgi.sock
  8. # 进程个数
  9. workers=5
  10. pidfile=/home/hj/桌面/Celery_Test/script/uwsgi.pid
  11. # 指定IP端口
  12. http=192.168.21.128:8080
  13. # 指定静态文件
  14. static-map=/static=/home/hj/桌面/Celery_Test/static
  15. # 启动uwsgi的用户名和用户组
  16. uid=root
  17. gid=root
  18. # 启用主进程
  19. master=true
  20. # 自动移除unix Socket和pid文件当服务停止的时候
  21. vacuum=true
  22. # 序列化接受的内容,如果可能的话
  23. thunder-lock=true
  24. # 启用线程
  25. enable-threads=true
  26. # 设置自中断时间
  27. harakiri=30
  28. # 设置缓冲
  29. post-buffering=4096
  30. # 设置日志目录
  31. daemonize=/home/hj/桌面/Celery_Test/script/uwsgi.log

配置好之后,运行 uwsgi --ini uwsgi.ini 启动 uwsgi,出现如下信息即表示启动成功:

  1. hj@hj:~/桌面/Celery_Test$ uwsgi --ini uwsgi.ini
  2. [uWSGI] getting INI configuration from uwsgi.ini
  3. [uwsgi-static] added mapping for /static => /home/hj/桌面/Celery_Test/static

查看运行情况:

  1. ps ajx|grep uwsgi

效果如下图:

常用命令:

  1. uwsgi --ini uwsgi.ini # 启动
  2. # 启动时会生成两个文件,分别为:
  3. # PID文件 标识这个程序所处的状态
  4. # SOCK文件 用来和其他程序通信的
  5. uwsgi --stop uwsgi.pid # 停止
  6. uwsgi --reload uwsgi.ini # 重置

Tips

停止时出现 signal_pidfile()/kill(): No such process [core/uwsgi.c line 1693]

原因:当前端口进程与 uwsgi.pid 不一致,查看当前端口实际进程 ID,并修改 uwsgi.pid

  1. # 根据端口,查看进程
  2. hj@hj:~/桌面/Celery_Test$ sudo netstat -nap | grep 8080
  3. tcp 0 0 192.168.21.128:8080 0.0.0.0:* LISTEN 6943/uwsgi
  4. # 修改 uwsgi.pid 的值为 6943,并再重新停止
  5. hj@hj:~/桌面/Celery_Test$ uwsgi --stop script/uwsgi.pid
  6. # 查看发现已经成功停止
  7. hj@hj:~/桌面/Celery_Test$ ps ajx|grep uwsgi
  8. 5231 14550 14549 5231 pts/1 14549 S+ 1000 0:00 grep --color=auto uwsgi

Linux 中怎么查看端口和进程号

  1. # 加上 sudo
  2. # 根据进程 pid 查看端口
  3. lsof -i | grep pid
  4. # 根据端口查看进程
  5. lsof -i:port
  6. # 根据进程 pid 查看端口
  7. netstat -nap | grep pid
  8. # 根据端口查看进程号
  9. netstat -nap | grep port

2. Nginx 服务器

我们知道 uWSGI 处理静态文件请求能力比较弱,因此一般实际生产环境中以 动静分离 的方式处理动静请求,即 uWSGI + Nginx。

Nginx 作用还包括负载均衡、反向代理等。

2.1 Ubuntu 上安装 Nginx

Nginx 的软件包在 Ubuntu 默认软件仓库中可用。 安装非常简单,只需键入以下命令:

  1. sudo apt update
  2. udo apt install nginx

查看服务器版本信息:

  1. sudo nginx -v
  2. nginx version: nginx/1.14.0 (Ubuntu)

查看服务器状态:

  1. # 两个都可以
  2. sudo systemctl status nginx
  3. ps -ef | grep nignx

配置防火墙

打开 80 和 443 端口允许通过防火墙:

  1. hj@hj:~$ sudo ufw allow 'Nginx Full'
  2. 防火墙规则已更新
  3. 规则已更新(v6)

检查是否更改:

  1. hj@hj:~$ sudo ufw status
  2. 状态: 激活
  3. 动作 来自
  4. - -- --
  5. 22 ALLOW Anywhere
  6. 4200 ALLOW Anywhere
  7. Nginx Full ALLOW Anywhere
  8. 22 (v6) ALLOW Anywhere (v6)
  9. 4200 (v6) ALLOW Anywhere (v6)
  10. Nginx Full (v6) ALLOW Anywhere (v6)

测试安装

访问:http://192.168.21.128/

使用 systemctl 管理 Nginx 服务

您可以像任何其他 systemd 单位一样管理 Nginx 服务:

  1. # 停止Nginx服务
  2. sudo systemctl stop nginx
  3. # 再次启动
  4. sudo systemctl start nginx
  5. # 重新启动Nginx服务:
  6. sudo systemctl restart nginx
  7. # 在进行一些配置更改后重新加载 Nginx 服务:
  8. $sudo systemctl reload nginx
  9. # 如果你想禁用Nginx服务在启动时启动:
  10. $sudo systemctl disable nginx
  11. # 并重新启用它:
  12. $sudo systemctl enable nginx

参考链接:如何在Ubuntu 18.04上安装Nginx

2.2 CentOS 上安装

以CentOS6.x 系统为例

  1. 更换源:
  1. # 备份
  2. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  3. # 更换成国内源
  4. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  5. # 生成缓存
  6. yum makecache
  1. 安装 Nginx:
  1. yum -y install nginx

2.3 与 uWSGI 结合使用部署 Django

为 Nginx 添加配置文件,Ngnix 默认配置文件加载是在 /etc/nginx/conf.d/ 目录下,新建一个配置文件(名字随意),编辑如下:

  1. # 新建到配置文件 conf.d
  2. vim /etc/nginx/conf.d/
  3. # 编辑配置文件
  4. server { # 开始配置了
  5. listen 80; # 监听端口
  6. server_name 10.129.xxx.183 ; # 你访问的路径前面的 url名称
  7. access_log /var/log/nginx/access.log main; # Nginx日志配置
  8. charset utf-8; # Nginx编码
  9. gzip on; # 启用压缩,这个的作用就是给用户一个网页,比如3M压缩后1M这样传输速度就会提高很多
  10. gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支持压缩的类型
  11. error_page 404 /404.html; # 错误页面
  12. error_page 500 502 503 504 /50x.html; # 错误页面
  13. # 指定项目路径 uwsgi
  14. location / { # 类似于 Django的 url(r'^admin/', admin.site.urls),
  15. include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
  16. uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
  17. uwsgi_pass unix:/opt/project_teacher/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
  18. }
  19. # 指定静态文件路径
  20. location /static/ {
  21. alias /opt/project_teacher/teacher/static/;
  22. index index.html index.htm;
  23. }
  24. }

参考:

  1. server {
  2. listen 80;
  3. server_name 192.168.xx.128 ;
  4. access_log /var/log/nginx/access.log main;
  5. charset utf-8;
  6. gzip on;
  7. gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
  8. error_page 404 /404.html;
  9. error_page 500 502 503 504 /50x.html;
  10. location / {
  11. include uwsgi_params;
  12. uwsgi_connect_timeout 30;
  13. uwsgi_pass unix:/home/hj/桌面/Celery_Test/script/uwsgi.sock;
  14. }
  15. location /static/ {
  16. alias /home/hj/桌面/Celery_Test/static/;
  17. index index.html index.htm

启动 Nginx 服务 /etc/init.d/nginx start,访问:http://192.168.21.128:8080/app/index/,效果如下图:

常用命令:

  1. /etc/init.d/nginx start # 启动
  2. /etc/init.d/nginx stop # 关闭
  3. # Nginx配置是重启才生效,若修改配置不知道是否对不对,可以用来测试
  4. /etc/init.d/nginx configtest
  5. # 生产环境直接 reload就行了,不要 stop start 或者 restart
  6. /etc/init.d/nginx reload

配置 Django 静态文件

admin 所需的静态文件都在 Django 的安装内,我们没有配置指向 Django 的配置文件。

解决办法:

  1. 设置 settings.py ,将所有静态文件收集到 static_all 中:
  1. # settings.py
  2. STATIC_ROOT = os.path.join(BASE_DIR, "static_all")
  3. # 收集成功提示(仅供参考)
  4. 120 static files copied to '/home/hj/桌面/Celery_Test/static_all'.
  1. 收集静态文件到 static_all 这个目录中(可不创建 static_all):
  1. python3 manage.py collectstatic --noinput
  1. 修改 /etc/nginx/conf.d/test.ini 中静态文件路径:
  1. alias /home/hj/桌面/Celery_Test/static_all;

指定其他地方放置静态文件

  1. # 新建目录
  2. sudo mkdir -vp /var/www/test2/static/
  3. # 赋予权限
  4. sudo chmod 777 /var/www/test2/static/
  5. # 修改项目中 settings.py,指定静态文件路径
  6. STATIC_ROOT = '/var/www/test2/static/'
  7. STATIC_URL = '/static/'
  8. # 收集静态文件到 /var/www/test2/static/ 中
  9. python3 manage.py collectstatic
  10. # 输入 yes,开始收集,重新加载 Nginx 服务

uWSGI + Nginx + Django 部署的更多相关文章

  1. django项目在uwsgi+nginx上部署遇到的坑

    本文来自网易云社区 作者:王超 问题背景 django框架提供了一个开发调试使用的WSGIServer, 使用这个服务器可以很方便的开发web应用.但是 正式环境下却不建议使用这个服务器, 其性能.安 ...

  2. 阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略

    centos7+nginx+python3+django+uwsgi配置Django 项目部署   1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,t ...

  3. uWSGI+nginx+django+virtualenv+supervisor部署项目

    一.前言 在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令. 相关链接: Centos7安装py ...

  4. Django+uwsgi+Nginx安装部署

    安装 安装Nginx Nginx是最流行的高性能HTTP服务器. 安装pcre: wget https://sourceforge.net/projects/pcre/files/pcre/8.37/ ...

  5. django+uwsgi+nginx的部署

    1.下载与项目对应的django版本pip3 install django==1.11.16 -i https://pypi.douban.com/simple/2.用django内置的wsgi模块测 ...

  6. Django部署,Django+uWSGI+nginx+Centos部署

    说明:系统是在windows上开发的,使用django1.11.4+python3.6.3开发,需要部署在centos6.4服务器上. 第一步:在Centos6.4上安装Python3.6.2 安装请 ...

  7. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

  8. linux上uwsgi+nginx+django发布项目

    在发布项目前首先将部署环境进行搭建,尤其是依赖包一定需要提前安装. 一.虚拟环境的搭建 1.建议在linux下新建一个虚拟环境,这样有独立干净的环境. mkvirtualenv -p python3 ...

  9. Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

随机推荐

  1. vim配置与使用

    Vim 是一个上古神器,本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项,以及持续分享一个前端工作者不得不安装的一些插件,而关于 Vim 的简介,主题的选择,以及为何使用 vi ...

  2. Docker-Mac安装

    1. 下载安装包2. 安装3. 运行,允许docker获得系统权限,它需要将Mac网卡链接至Docker app.4. 验证 打开terminaldocker versionFengZhendeMac ...

  3. Java -- 国际化 多语化

    1. 以中英两种语言做示例,显示 "hello" 2. 建立英文语言文件 "mess_en_US.properties ", 输入内容 "hello= ...

  4. Java企业微信开发_07_JSSDK多图上传

    一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失 ...

  5. [原]NYOJ-字符串替换-113

    大学生程序代写 /*http://acm.nyist.net/JudgeOnline/problem.php?pid=113 字符串替换 时间限制:3000 ms  |  内存限制:65535 KB  ...

  6. [BZOJ2962][清华集训]序列操作

    bzoj luogu 题意 有一个长度为\(n\) 的序列,有三个操作: \(I \ \ a\ b\ c\ :\)表示将\([a,b]\)这一段区间的元素集体增加\(c\): \(R \ \ a\ b ...

  7. ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)

    题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4 这个题目自然会考虑到去讨论最长或者最短的板子. 笔上大概模拟一下的话,就 ...

  8. 系列文章--突袭HTML5之Javascript

    突袭HTML5之Javascript API扩展5 - 其他扩展 突袭HTML5之Javascript API扩展4 - 拖拽 突袭HTML5之Javascript API扩展3 - 本地存储 突袭H ...

  9. bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...

  10. mysql root密码忘记重置

    1.修改/etc/my.cnf文件 找到mysqld选项,增加子项skip-grant-tables 2.重新启动mysql服务 service mysqld restart 3.进入mysql 在s ...