Centos7 使用uwsgi+nginx部署django
Centos7 使用uwsgi+nginx部署django
- 安装wget用于下载python源码包
yum install wget
- 安装python需要的组件
yum -y install zlib-devel bzip2-devel openssl-devel libffi-devel ncurses-devel sqlite-sevel readline-devel tk-devel gcc make
- 下载python源码包
""" 1. 下载python源码包 wget url 2.解压源码包 3.进入python目录,运行自检命令 ./configure --prefix=/usr/local/python37 # --prefix后面跟的是安装路径 4. 安装 make && make install 5.创建快捷命令(软连接) ln -s /usr/local/python37/bin/python3 /usr/bin/python3 6.安装虚拟环境 yum install python-virtualenv 7.创建虚拟环境 virtualenv -p /usr/local/python37/bin/python3 ./venv/python3 # python所在的路径 虚拟环境创建的路径 进入虚拟环境:source python3/bin/activate 退出虚拟环境:deactivate """
- 安装uwsgi
pip3 install uwsgi -i https://pypi.doubanio.com/simple
- uwsgi配置文件
[uwsgi] # 对外提供 http 服务的端口 http = 0.0.0.0:8000 #the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口 socket = 127.0.0.1:8001 # the base directory (full path) django 程序的主目录 chdir =../zhanhong_erp # 指定项目的application module=zhanhong_erp.wsgi:application # Django's wsgi file wsgi-file =../wsgi.py # maximum number of worker processes processes = 100 #thread numbers startched in each worker process threads = 10 #一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程 cheaper = 10 #在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数 idle = 3600 #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况 stats = 127.0.0.1:9000 #当一个请求被harakiri杀掉会,会输出一条日志 harakiri-verbose = true #开启内存使用情况报告 memory-report = true #设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒) reload-mercy = 10 #设置工作进程使用虚拟内存超过N MB就回收重启 reload-on-as= 1024 #自动给进程命名 auto-procname = true #为进程指定前缀 procname-prefix-spaced = xc-mms #设置工作进程每处理N个进程就会被回收重启 max-requests=500000 #设置工作进程使用物理内存超过N MB就回收重启 reload-on-rss=100 # ========================= 如果项目需要下载大文件,下载时间较长,需要将下面三个超时时间延长 ========================= #当uwsgi和nginx配合使用时设置这个,设置socket超时时间,默认4秒 socket-timeout=6000 # 当uwsgi单独使用时或者nginx直接使用proxy方式的时候,超时时间需要配置这个 http-timeout=6000 #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃 harakiri = 6000 # ========================================================================================================= #限制http请求体的大小(Bytes) limit-post=4096 # clear environment on exit vacuum = true #不记录request日志,只记录错误日志 disable-logging = true #将日志打印到syslog上 #log-syslog = true # pid文件保存位置 pidfile = uwsgi.pid # 后台运行,并输出日志 daemonize = /var/log/zhanhong.log stats=./uwsgi.status
启动:uwsgi --ini uwsgi.ini 停止:uwsgi --stop uwsgi.pid 重启:uwsgi --reload uwsgi.pid
- 安装nginx
yum install nginx -y
# =====================================全局配置==================================================== vi /etc/nginx/nginx.conf user nginx; # 进程数量 worker_processes 4; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { # 最大连接数量 worker_connections 4096; } 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; }
# ===================================== 单项目配置 ================================== vi /etc/nginx/conf.d/项目名.conf # ============================= 正常配置 ====================================== server { listen 80; server_name 127.0.0.1; access_log /var/log/nginx/access.log main; charset utf-8; gzip on; 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; error-page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定项目路径 location / { include uwsgi_params; uwsgi_connect_timeout 30; uwsgi_pass unix;/opt/project_zhanhong/script/uwsgi.sock; } #指定静态文件路径 location /static/{ alias /opt/project_teacher/teacher/static/; index index.html index.htm; } }
# ===================================== 单项目配置 ================================== vi /etc/nginx/conf.d/项目名.conf # ============================= 负载均衡配置 ======================================== upstream mywebserver { # 这里写服务器集群 server 127.0.0.1:8000; } server { listen 80; server_name 0.0.0.0; charset UTF-8; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; client_max_body_size 75M; location / { # 解决下载大文件超时的问题 proxy_read_timeout 6000s proxy_pass http://mywebserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
启动:systemctl start nginx.service 停止:systemctl stop nginx.service 重启:systemctl restart nginx.service
- 遇到的错误1
""" 系统启动Nginx后,报 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)错误的处理方式,分为两种: 第一种:端口小于1024的情况: 原因是1024以下端口启动时需要root权限,所以sudo nginx即可。 第二种:端口大于1024的情况: 这种情况,需要如下操作: 首先,查看http允许访问的端口: semanage port -l | grep http_port_t http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 其次,将要启动的端口加入到如上端口列表中 semanage port -a -t http_port_t -p tcp 8090 CentOS安装semanage的方法 yum install semanage 如果提示:No package semanage available.使用下面方法 yum provides semanage 执行成功之后 (提示:Filename : /usr/sbin/semanage) yum -y install policycoreutils-python.x86_64 安装成功 """
- 遇到的错误2
""" connect() to 192.168.1.118:8888 failed (13: Permission denied) 查看selinux是否开启,如果开启需要关闭 [root@localhost ~]# getenforce Enforcing [root@localhost ~]# setenforce 0 [root@localhost ~]# getenforce Permissive [root@localhost ~]# sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config 网上还有一种说法,在此记录下。执行下面的命令 setsebool -P httpd_can_network_connect 1 """
- django 静态文件问题
# 在settings中添加 STATIC_ROOT = os.path.join(BASE_DIR, "static") # STATICFILES_DIRS必须为空否者会报错 然后执行 python manage.py collectstatic 这时静态文件被提取到项目根目录的 static下
然后配置路由from django.views import static
from django.conf import settings# 添加这个路由
re_path(r'^static/(?P<path>.*)$', static.serve,
{'document_root': settings.STATIC_ROOT}, name='static')
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)