Django后台服务器部署(apache|nginx)

Django后台服务器部署(apache|nginx)

  • 前言
    • nginx和apache
    • Django+uWSGI+Nginx
    • Django+WSGI+Apache
  • 常见问题

前言

Django 是一个开放源代码的Web应用框架,由Python写成。一般情况下用户都可以通过Django官方文档在流畅的本地搭建和调试自己的Web,但是在服务器部署方面总会因为远程服务器本身环境的不同而发生意外,出现各种各样的问题。在此,UP在配置以下RiceLncPedialuncDB这两个网站遇到了一些问题,经历了一段时间的修改后,想写下这个小日记分享一下,希望可以帮助大家!

nginx和apache

Apache和Nginx都是Web服务器软件,都可以作为Django后台的Web服务器,其中有两种模式

  1. Django+uWSGI+Nginx
    uWSGI作为Nginx的代理服务器
  2. Django+WSGI+Apache
    WSGI作为Apache的代理服务器

nginx
轻量级,nginx 处理请求是异步非阻塞的,在高并发下nginx 占用更少的内存及资源抗并发,能保持低资源低消耗,模块社区非常活跃。
apache
apache 处理请求是阻塞的,稳定。

Django+uWSGI+Nginx

  1. 配置前准备:
    # 在项目目录下迁移静态文件
    python manage.py collectstatic
    # 安装依赖
    pip install uwsgi
    
  2. Django配置
    1. settings.py 添加static和media的配置

      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, "static/")
      STATICFILES_DIRS = (
      os.path.join(BASE_DIR, "static/"),
      )
      MEDIA_URL = '/media/'
      MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
      
    2. urls.py 添加static和media路由

      from lncRNA import settings
      from django.views.static import serve
      
      urlpatterns = [
         path('admin/', admin.site.urls),
         url(r'^static/(?P.*)$', serve, {
               'document_root': settings.STATIC_ROOT}, name='static'),
         url(r'^media/(?P.*)', static.serve, {
               'document_root': settings.MEDIA_ROOT})
      ]
      
  3. uwsgi配置 (以端口10092为例)
    在项目下新建uwsgi.ini文件
    	[uwsgi]
    	# 项目名称,此处为lncrna
    	module=lncrna.wsgi:application
    	# 直接访问uwsgi的端口号,绕过nginx
    	# http = :8000
    	# 转发给nginx的端口号
    	#socket = 127.0.0.1:10092
    	http-socket = :10092
    	# 进程ID文件
    	pidfile=/home/lncRNAdb/run/uwsgi.pid
    	# 是否使用主线程
    	master = true
    	# 项目的绝对路径
    	chdir = /home/lncRNAdb/lncRNA
    	# Django项目wsgi.py文件的相对路径
    	wsgi-file = lncRNA/wsgi.py
    	# 进程数
    	processes = 4
    	# 每个进程的线程数
    	threads = 2
    	# 监听端口
    	#stats = 127.0.0.1:1031
    	# 每次退出时是否清理环境配置
    	vacuum = true
    	# 目录中一旦有文件被改动就自动重启
    	touch-reload = /home/lncRNAdb/lncRNA/templates
    	# 存放日志
    	daemonize = /home/ylncRNAdb/log/uwsgi_lcdb.log
    	```
    
  4. nginx配置 (以端口10092为例)
     server {
         listen       80 default_server;
         listen       [::]:80 default_server;
         server_name  ***.***.***.***;
         #root         /usr/share/nginx/html;
    
         # Load configuration files for the default server block.
         include /etc/nginx/default.d/*.conf;
         location / {
             uwsgi_pass 218.199.68.191:10092;
             include /etc/nginx/uwsgi_params;
         }
         location /static {
             expires 1d;
             autoindex on;
             alias /home/lncRNAdb/lncRNA/static;
         }
    
  5. 数据库配置
    如果使用的是远程PostgreSQL数据库,则需要修改配置,否则跳过此步骤
    1. PostgreSQL的安装目录,进入data文件夹,打开postgresql.conf文件,修改listen_addresses,如下
      listen_addresses = '*'
      
    2. 也是在data文件夹下,打开pg_hba.conf文件,修改如下:
       # TYPE DATABASE USER CIDR-ADDRESS METHOD
       # "local" is for Unix domain socket connections only
       local   all             all                                     trust
       # IPv4 local connections:
       host    all             all             127.0.0.1/32            trust
       host    all             clsteam         218.199.0.0/16          password
       # IPv6 local connections:
       host    all             all             ::1/128                 trust
      
  6. 使用方法
    1. 启动uwsgi uwsgi uwsgi.ini
    2. 关闭uwsgi uwsgi --stop uwsgi.pid
    3. 重启uwsgi uwsgi --reload uwsgi.pid
    4. 关闭端口占用 fuser -k 8000/tcp

Django+WSGI+Apache

一般情况推荐使用上述Nginx代理方法,如果原服务器本身包含Apache服务器可以选择使用此方法代理,可参考Django官网文档和mod-wsgi文档。
PS:最好需要有root权限的用户进行操作,而且全程使用的同一个环境(同个python环境)。

  1. 配置前准备
    # 在项目目录下迁移静态文件
    python manage.py collectstatic
    # 安装依赖
    pip install mod_wsgi
    # 得到配置文件位置
    mod_wsgi-express module-config
    
    mod_wsgi-express module-config可以得到Apache配置参数,到时候直接copy到Apache的配置文件,例如得到
    LoadModule wsgi_module "/usr/local/miniconda3/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
    WSGIPythonHome "/usr/local/miniconda3"
    
  2. Django配置同上
  3. wsgi.py配置
    添加一个项目跟目录到环境变量(例如我的Django项目名称为lncRNA)
    import sys
    sys.path.append('/var/www/html/lncRNA')
    
  4. Apache配置(此处配置了2个Django服务器)
    LoadModule wsgi_module "/usr/local/miniconda3/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
    WSGIPythonHome "/usr/local/miniconda3"
    #WSGIPythonPath /var/www/html/lncRNA
    
        DocumentRoot "/var/www/html/3dgenome"
        ServerName 3dgenome.hzau.edu.cn
        WSGIDaemonProcess RiceLncPedia processes=2 threads=15 display-name=%{GROUP}
        WSGIProcessGroup RiceLncPedia
        WSGIScriptAlias /RiceLncPedia /var/www/html/lncRNA/lncRNA/wsgi.py process-group=RiceLncPedia
        
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
        
        Alias /RiceLncPedia/media/ /var/www/html/lncRNA/media/
        Alias /RiceLncPedia/static/ /var/www/html/lncRNA/static/
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
    
        WSGIDaemonProcess luncDB processes=2 threads=15 display-name=%{GROUP}
        WSGIProcessGroup luncDB
        WSGIScriptAlias /luncDB /var/www/html/luncDB/luncDB/wsgi.py process-group=luncDB
        
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
        
        Alias /luncDB/media/ /var/www/html/luncDB/media/
        Alias /static/ /var/www/html/luncDB/vue-client/dist/static/
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
        
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Require all granted
        
    
    

常见问题

  1. 本地可以访问,外网不能访问,可能和端口、防火墙设置相关,可以选择关闭防火墙。
    方法一:添加防火墙规则,firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 port port=10091 protocol=tcp accept'
    方法二:关闭防火墙,systemctl disable firewalld, systemctl stop firewalld
    例如Centos服务器命令行关闭:systemctl stop firewalld.service
  2. 静态页面可以访问,动态页面(连接数据库)出现forBiden,可能是SElinux的权限访问设置,可以暂时关闭SElinux尝试是否可以访问,如果可以,尝试修改SElinux配置。
    暂时关闭SElinux:setenforce 0
    允许httpd权限访问PostgreSQL数据库:setsebool httpd_can_network_connect_db 1

相关连接:

  1. 我的Github主页

你可能感兴趣的:(Django,django,python,nginx,apache,数据库)