zoukankan      html  css  js  c++  java
  • django+nginx+mod_wsgi+apache网站部署

    软件安装

    0.如果对selunix不熟就先把它停掉

      vi /etc/selinux/config

      改动selinux=diabled

      然后重启计算机

    1.编译安装python

      mod_wsgi的安装需要使用到python的共享库,编译安装python时要启用共享库

      ./congifure --enable-shared

      make &&make install

      添加python链接库到路径

      sudo vi /etc/ld.so.conf 

      /usr/local/Python2.7/lib  #添加路径到文件

      sudo  /sbin/ldconfig -v

    2.安装apache yum -y install apache

    3.安装mod_wsgi其实mod_wsgi有两种安装模式,除了单独安装(yum/编译)之外,还可以通过pip install mod_wsgi方式进行安装

      ./configure --with-apxs=/usr/local/apache/bin/apxs

        --with-python=/usr/local/bin/python

    4.安装django pip install django==1.8

    三者的关系以及工作过程

      mod_wsgi是apache的一个模块,是遵循python的wsgi协议而开发的、用于连接python web框架的扩展。从这个关系可以看出,这几个软件的信息流是怎样的?

      首先,apache监控服务器主机的80端口,当接收到来自客户端请求的时候,apache会判断这个请求是否匹配,如果匹配其中的某个条件,那么apache就会将这个请求通过mod_wsgi来转发给Django进程进行处理,Django会对这个请求进行进一步处理,执行业务逻辑,最后通过wsgi协议返回响应给apache,apache接收到这个响应之后就会发送给客户端。注意,django再整个部署的过程中是不需要手动启动的,平时我们开发的时候使用python manage.py runserver只是开发过程中调试用的。

    配置

    配置django

      如果只采用默认的settings的话,是不需要再配置django文件的,如果想分别使用不同的进程来启动同一个项目中的不同应用的话,需要配置wsgi.py中的django环境变量。

    配置mod_wsgi

      同样,mod_wsgi默认也是不需要配置的,除非有高级的需求,否则初级的配置只需要默认即可。

    配置apache

      对apache这个服务器软件的所有操作都在其配置文件中完成。

      配置文件默认为/etc/httpd/conf/httpd.conf。

      配置文件的具体写法在其官方文档中有详细说明: http://httpd.apache.org/docs/2.2/configuring.html

      apache是一个模块化的软件,除了一些必要的模块在编译时嵌入之外,其它模块需要在配置文件中导入才能发挥作用,apache的所有模块都以mod开头。mod_wsgi毫无疑问需要导入才能使用:

      LoadModule wsgi_module modules/mod_wsgi.so

      另外,配置文件可以直接写在这个配置文件中,也可以写在别的地方,然后导入作为配置的一部分,例如可以把文件写在django项目的根目录下。在apache配置文件中导入这个文件

      Include /root/test1/apache_django_wsgi.conf

      这样就跟全部写在httpd.conf中一样了。

      最终的配置文件简单地配置成下面这个样子:

      1 LoadModule wsgi_module modules/mod_wsgi.so
      2 
      3 <IfModule mod_wsgi.c>
      4 
      5 # '/' 代表你想服务你的应用的base URL路径,'/'也就是root url
      6 
      7 # /path/to.../wsgi.py代表使用WSGI应用来服务该url下的所有请求
      8 
      9 # 如果应用在子目录中(https://example.com/mysite in this example),使用下面的设置
     10 
     11 #WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
     12 
     13 WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
     14 
     15  
     16 
     17 # 如果建立了虚拟环境,将此路径指向虚拟环境的python path
     18 
     19 WSGIPythonHome /path/to/venv
     20 
     21 # WSGIPythonPath让你的项目包能够使用import导入到python path,也就是说import mysite能够运行
     22 
     23 WSGIPythonPath /path/to/mysite.com
     24 
     25  
     26 
     27 # 下面的代码保证apache能使用wsgi.py文件
     28 
     29 <Directory /path/to/mysite.com/mysite>
     30 
     31 <Files wsgi.py>
     32 
     33 Order deny,allow
     34 
     35 Allow from all
     36 
     37 #apache2.4版本的命令
     38 
     39 #Require all granted
     40 
     41 </Files>
     42 
     43 </Directory>
     44 
     45  
     46 
     47 #守护模式下的配置,其中不能使用WSGIPythonHome和WSGIPythonPath,而要使用python-home和python-path
     48 
     49 # 进程名字随意起
     50 
     51 WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
     52 
     53 user=apache  group=apache
     54 
     55 WSGIProcessGroup example.com
     56 
     57  
     58 
     59 #由于django本身不会serve files,所以需要别的web server承担这个工作,可以选择其它没有运行django的服务器来承担
     60 
     61 #但是如果必须用同一台apache的话,可以将一些url设置成静态文件路径
     62 
     63 #例如
     64 
     65 # 相当于 www.xxx.com/robot.txt  -->/path/to/mysite.com/static/robots.txt
     66 
     67 Alias /robots.txt /path/to/mysite.com/static/robots.txt
     68 
     69 Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
     70 
     71 Alias /media/ /path/to/mysite.com/media/
     72 
     73 Alias /static/ /path/to/mysite.com/static/
     74 
     75  
     76 
     77 <Directory /path/to/mysite.com/static>
     78 
     79 Require all granted
     80 
     81 </Directory>
     82 
     83  
     84 
     85 <Directory /path/to/mysite.com/media>
     86 
     87 Require all granted
     88 
     89 </Directory>
     90 
     91  
     92 
     93 <Directory /path/to/mysite.com/mysite>
     94 
     95 <Files wsgi.py>
     96 
     97 Require all granted
     98 
     99 </Files>
    100 
    101 </Directory>
    102 
    103  
    104 
    105 AddType text/html  .py
    106 
    107 WSGISocketPrefix /var/run/
    108 
    109  
    110 
    111 </IfModule>

      当然也可以将相关的配置写在虚拟主机的配置中。

      apache配置文件:虚拟主机的配置参数(略)

    mod_wgsi配置过程中可能遇到的问题:

    5xx服务器内部错误

    这种问题可以通过检查apache的错误文件发现问题,错误文件/var/log/httpd/error.log中出现类似于 mod_wsgi (pid=20380): Target WSGI script '/var/www/test0/test0/wsgi.py' cannot be loaded as Python module.

      问题很可能出在所安装的mod_wsgi扩展没有找到相应的链接库。

      解决方法:

        1.检查python编译安装要安装共享库

          ./configure --enabled-shared

          make && make install

        2.添加共享库到路径

           sudo vi /etc/ld.so.conf 

          /usr/local/Python2.7/lib

          sudo  /sbin/ldconfig -v

        3.使用编译安装mod_wsgi

          ./configure --with-apxs=/usr/local/apache/bin/apxs

            --with-python=/usr/local/bin/python

    报错:Permission denied: mod_wsgi (pid=2081): Unable to connect to WSGI daemon process 'autotester' on '/etc/httpd/logs/wsgi.2076.0.1.sock' after multiple attempts

      可在apache配置文件或者wsgi.conf中添加

      WSGISocketPrefix /var/run/

      来自 <https://my.oschina.net/crazyharry/blog/336811>

    使用.configure  --enable-shared 安装python2.7之后出现下面的报错:

      error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

      解决方法如下:

        来自 <http://blog.csdn.net/wanyanxgf/article/details/8021641>

        1.编辑      vi /etc/ld.so.conf 

          如果是非root权限帐号登录,使用 sudo vi /etc/ld.so.conf 

          添加上python2.7的lib库地址,如我的/usr/local/Python2.7/lib,保存文件

        2.执行 /sbin/ldconfig -v命令,如果是非root权限帐号登录,使用 sudo  /sbin/ldconfig -v。这样 ldd 才能找到这个库,执行python2.7就不会报错了

          /etc/ld.so.conf:

          这个文件记录了编译时使用的动态链接库的路径。

          默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件

          如果你安装了某些库,没有指定 --prefix=/usr 这样lib库就装到了/usr/local下,而又没有在/etc/ld.so.conf中添加/usr/local/lib,就会报错了

        ldconfig是个什么东东吧 :

          它是一个程序,通常它位于/sbin下,是root用户使用的东东。具体作用及用法可以man ldconfig查到

          简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件 缓存到/etc/ld.so.cache 以供使用

          因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig

          使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库。

  • 相关阅读:
    IDEA下Maven的pom文件导入依赖出现Auto build completed with errors
    org.apache.jasper.JasperException: java.lang.NullPointerException
    Eclipse下导入web项目(Some projects cannot be imported because they already exist in the workspace)
    JS中构造函数的方法定义在原型对象里
    JS变量赋值
    JDBC以及连接池连接MySQL出现时区错误问题
    chrome中如何截取整个网页
    java中final、super、static关键字的使用
    初识less
    根据当前时间显示问候语
  • 原文地址:https://www.cnblogs.com/zhangjpn/p/6749588.html
Copyright © 2011-2022 走看看