centos部署Nginx+uwsgi+django

参考

  • https://blog.csdn.net/yilovexing/article/details/82969103
  • djanog-2.2
  • uwsgi-2.0

1. 首先通过django直接运行项目-调试模式

先在服务器上放上网站项目代码,然后python manage.py runserver 0.0.0.0:80,打开浏览器看能否访问。注意开启防火墙,包括云服务器防火墙,linux防火墙。

2. 然后通过uwsgi运行项目-不走nginx

关掉上面的manage.py, python下安装uwsgi,通过uwsgi运行项目

检查项目中wsgi.py是否存在

参考django官方文档,https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/ ,
用django start-project 命令创建的项目会在创建时自带 wsgi.py

假设项目根目录为/www/myadmin, 创建项目时在此目录下执行django-admin startproject server .,默认会创建/www/myadmin/server/uwsgi.py。如果不存在则需手动创建,方法参考上面的django官方文档。

在项目文件夹根目录下新建uwsgi.ini配置文件。

; run: uwsgi --ini uwsgi.ini
; reload: uwsgi --reload uwsgi.pid
; stop: uwsgi --stop uwsgi.pid

[uwsgi]
chdir=/www/your_websit
pidfile = /www/your_website/uwsgi.pid
daemonize = /www/your_website/running.log ;记录日志的位置

module=server.wsgi:application
master=True
vacuum=True
max-requests=5000
py-autoreload = 1 ;修改py文件后自动重启uwsgi
processes=4 ;根据实际cpu数量酌情配置
disable-logging = true ;正常的request不记录,只记录异常

http-socket = :8090 ;网页直接访问,可用于测试没有nginx时是否正常运行。
socket = 127.0.0.1:30888 ;和nginx相连时的配置

  • 配置daemonize = *.log,会使任务在后台运行。
  • 配置logto = *.log, 会使任务在前台运行。
  • 网上说的后台运行方法uwsgi -d --ini uwsgi.ini,可能是老版本的,这个命令在2.2版本会创建一个名为--ini的文件作为日志文件,命令后面的uwsgi.ini会被被忽略。

通过uwsgi启动项目

cd到项目根目录下,先测试没有nginx时uwsgi是否正常运行:

# 激活虚拟环境
conda activate your_env

# 启动wsgi,该命令相当于上面的 python manage.py runserver 
uwsgi --ini uwsgi.ini

浏览器访问服务器8090端口。因为配置文件中设置了http-socket=8090,所以此时应该能访问网站,但是静态文件打不开(注意防火墙开放端口)。

错误排查

如果不能访问,可查看uwsgi的日志排查错误,/www/your_website/running.log

3. 最后通过nginx + wsgi 运行项目

安装nginx

参考 https://www.jianshu.com/p/8a6d923cda9f

# 添加nginx存储库
sudo yum install epel-release

# 使用yum安装Nginx
sudo yum install nginx

# 也可以试试这个:https://www.jianshu.com/p/c22faafc7b8b 
yum install nginx --enablerepo=epel

# 设置nginx开机自启动
systemctl enable nginx

# 重启nginx
systemctl restart nginx

配置nginx

ubuntu Nginx 默认的配置文件在 /etc/nginx 目录下,centos 发行版的配置文件是在 /etc/nginx/nginx.conf

  • server_name可以区分从不同hostname网址来的请求,比如两个网址都解析到了该主机,那么设置server_name可以将其区分。设置为_表示所有如果没有其他适配的,就到这里。

  • client_max_body_size,前端上传文件大小限制,nginx默认是1m

  • 可以设置多个server,实现一台主机上部署多个网站。通过listen不同的端口,设置不同的server_name来区别不同的请求。

...

http {
    ...
    server {
        listen 80;
        client_max_body_size 200m;  
        
        server_name  _;
        ...

        #配置uwsgi转发,需要和上面uwsgi.ini中的端口对应
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:30888; 
        }

        # serve静态文件
        location /static {
            autoindex on; 
            alias /www/myadmin/static/; 
        }
        ...
    }
    

    server {
        listen 80;
        listen 8090;
        client_max_body_size 200m; 
        server_name  www.aaa.com www.bbb.com;
        ...
    }
    
    

}

重启nginx使配置生效:

systemctl restart nginx

uwsgi可能也需要重启:

# 先激活python虚拟环境,再执行下面语句
uwsgi --stop uwsgi.pid
uwsgi --ini uwsgi.ini

#或者使用reload
uwsgi --reload uwsgi.pid

测试和错误排查

此时访问服务器的80端口,应该能正常访问网站,包括静态资源。

如果不行,可能需要关闭SELinux。 临时关闭:输入命令setenforce 0,永久关闭,vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled

另外可查看nginx中配置中error_log的位置,检查nginx的error_log。默认路径为/var/log/nginx/error.log

4. 设置开机自启动

创建sh脚本,脚本中激活anaconda,然后启动uwsgi服务。

# #!/bin/sh
# #this script will run in background

systemctl start nginx

source /root/anaconda3/bin/activate syadmin

uwsgi --ini /www/syadmin/uwsgi.ini

# nohup python /www/your_webst/manage.py start_circle_task >/dev/null 2>&1 &

有了上面的sh脚本后,可以将其加入/etc/rc.d/rc.local中实现开机自启动。

也可以用systemctl启动。参考下面的方法(这个没有实践):

  • https://blog.csdn.net/huaishuming/article/details/79794637
  • https://blog.csdn.net/sinat_41292836/article/details/103764842

创建systemctl服务,指定Type=forking,systemd认为当该服务fork出子进程并生成PIDFile,且父进程退出后服务启动成功。同时指定 PIDFile=FilePath,以便 systemd 能够跟踪服务的主进程。

你可能感兴趣的:(centos部署Nginx+uwsgi+django)