设为首页 收藏本站
查看: 1044|回复: 0

[经验分享] django+nginx+mod

[复制链接]

尚未签到

发表于 2017-12-24 12:31:14 | 显示全部楼层 |阅读模式
软件安装
  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中一样了。
  最终的配置文件简单地配置成下面这个样子:
  

LoadModule wsgi_module modules/mod_wsgi.so  

  
<IfModule mod_wsgi.c>
  

  
# '/' 代表你想服务你的应用的base URL路径,'/'也就是root url
  

  
# /path/to.../wsgi.py代表使用WSGI应用来服务该url下的所有请求
  

  
# 如果应用在子目录中(https://example.com/mysite in this example),使用下面的设置
  

  
#WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
  

  
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  

  
  
  

  
# 如果建立了虚拟环境,将此路径指向虚拟环境的python path
  

  
WSGIPythonHome /path/to/venv
  

  
# WSGIPythonPath让你的项目包能够使用import导入到python path,也就是说import mysite能够运行
  

  
WSGIPythonPath /path/to/mysite.com
  

  
  
  

  
# 下面的代码保证apache能使用wsgi.py文件
  

  
<Directory /path/to/mysite.com/mysite>
  

  
<Files wsgi.py>
  

  
Order deny,allow
  

  
Allow from all
  

  
#apache2.4版本的命令
  

  
#Require all granted
  

  
</Files>
  

  
</Directory>
  

  
  
  

  
#守护模式下的配置,其中不能使用WSGIPythonHome和WSGIPythonPath,而要使用python-home和python-path
  

  
# 进程名字随意起
  

  
WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
  

  
user=apache  group=apache
  

  
WSGIProcessGroup example.com
  

  
  
  

  
#由于django本身不会serve files,所以需要别的web server承担这个工作,可以选择其它没有运行django的服务器来承担
  

  
#但是如果必须用同一台apache的话,可以将一些url设置成静态文件路径
  

  
#例如
  

  
# 相当于 www.xxx.com/robot.txt  -->/path/to/mysite.com/static/robots.txt
  

  
Alias /robots.txt /path/to/mysite.com/static/robots.txt
  

  
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
  

  
Alias /media/ /path/to/mysite.com/media/
  

  
Alias /static/ /path/to/mysite.com/static/
  

  
  
  

  
<Directory /path/to/mysite.com/static>
  

  
Require all granted
  

  
</Directory>
  

  
  
  

  
<Directory /path/to/mysite.com/media>
  

  
Require all granted
  

  
</Directory>
  

  
  
  

  
<Directory /path/to/mysite.com/mysite>
  

  
<Files wsgi.py>
  

  
Require all granted
  

  
</Files>
  

  
</Directory>
  

  
  
  

  
AddType text/html  .py
  

  
WSGISocketPrefix /var/run/
  

  
  
  

  
</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库。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427498-1-1.html 上篇帖子: tomcat启动报错 java.lang.ClassNotFoundException: org.apache.jsp.index 下篇帖子: MyBatis 传List参数 nested exception is org.apache.ibatis.binding.BindingException:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表