SlideShare a Scribd company logo
1 of 36
GETTING
 STARTED
   WITH
MOD_WSGI
Graham Dumpleton
   PyCon Australia
     June 2010
WHAT IS WSGI?
• Specification
            for an interface between web servers and
 Python web applications or frameworks.

• Intended to promote web application portability across a
 variety of web servers.

• PEP   333 - http://www.python.org/dev/peps/pep-0333

• More   Information - http://www.wsgi.org
WHAT IS MOD_WSGI?

• An Apache module to support hosting WSGI applications in
 conjunction with the Apache web server.

• Interceptsrequests to designated URLs and passes requests
 off to the WSGI application specified in the target WSGI script
 file that the URL maps to.
HELLO WORLD
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]
MAPPING A URL

• Mapping WSGI   application at root of web server.
 WSGIScriptAlias / /home/grumpy/example-1/hello.wsgi


• Mapping WSGI   application at sub URL of web server.
 WSGIScriptAlias /suburl /home/grumpy/example-1/hello.wsgi
FORBIDDEN




client denied by server configuration: /home/grumpy/example-1/hello.wsgi
DENY FROM ALL

• By   default Apache denies access to everything.
 <Directory />
 Order deny,allow
 Deny from all
 </Directory>


• Thus   we need to open up access to our script.
 <Directory /home/grumpy/example-1>
 Order deny,allow
 Allow from all
 </Directory>
FORBIDDEN




(13)Permission denied: access to / denied
DRWXR-X---
• Apache    server child processes runs as a special user.

• The Apacheuser must be able to search directories down to
 where the WSGI script file is located.

• User
     account home directories often have permissions of
 drwxr-x--- and access is thereby restricted.

• Make   directories accessable to others.
 chmod o+rx /home/grumpy


• Better   still, don’t put WSGI script files under home directories.
INTERNAL SERVER ERROR




        (13)Permission denied: mod_wsgi (pid=666, process='',
application='tests.example.com|'): Call to fopen() failed for '/home/
                    grumpy/example-1/echo.wsgi'.
-RW-R-----

• Apache   server child processes runs as a special user.

• The Apache   user must be able to read the WSGI script file.

•A user account umask of 0007 will result in files being created
 with permissions of -rw-r----- and access is thereby restricted.

• Make   files readable to others.
 chmod o+r /home/grumpy/example-1/hello.wsgi
SUCCESS
DJANGO APPLICATION
• Install   Django.

• Create     an empty project.
  mkdir /home/grumpy/example-2
  cd /home/grumpy/example-2

  django-admin.py startproject mysite


• Run   the Django development server.
  python mysite/manage.py runserver
SUCCESS
DJANGO WSGI SCRIPT

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
DJANGO APACHE CONFIG

WSGIScriptAlias / /home/grumpy/example-2/apache/mysite.wsgi

<Directory /home/grumpy/example-2/apache>
Order deny,allow
Allow from all
</Directory>
INTERNAL SERVER ERROR




 raise ImportError("Could not import settings '%s' (Is it on sys.path?
    Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e))
  ImportError: Could not import settings 'mysite.settings' (Is it on
sys.path? Does it have syntax errors?): No module named mysite.settings
SYS.PATH
• Pythonmodules/packages are not imported relative to current
 working directory.

• Python modules/packages are not imported relative to the
 directory containing the WSGI script file.

• The  PYTHONPATH of the user who owns the WSGI script
 file is not consulted.

• Therefore
          must explicitly designate directories to search for
 Python modules/packages.
SYS.PATH.INSERT()

import os
import sys

root = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, root)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
SUCCESS
VIRTUAL ENVIRONMENT

• Create     and activate virtual environment
  cd /home/grumpy/example-2
  virtualenv --no-site-packages environ
  source environ/bin/activate


• Install   Django and other required packages.
  easy_install Django
SUCCESS
INTERNAL SERVER ERROR




 ImportError: No module named django.core.handlers.wsgi
SYS.PATH.INSERT()

import os
import sys

root = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, root)

packages = os.path.join(root,
    'environ/lib/python2.6/site-packages'
sys.path.insert(0, packages)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
SITE.ADDSITEDIR()
import os
import sys
import site

root = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, root)

packages = os.path.join(root,
    'environ/lib/python2.6/site-packages'
site.addsitedir(packages)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
ACTIVATE THIS
import os
import sys

root = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, root)

activate_this = os.path.join(root,
    'environ/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
SITE-PACKAGES
• Using sys.path.insert() allows directory to be placed first,
 but .pth files do not get processed.

• Using
      site.addsitedir() results in .pth files being processed, but
 new directories get placed last.

• Using activate_this.py results in .pth files being processed and
 sys.path reordered such that new directories get placed first.

• Value
      of sys.prefix is however altered by activate_this.py and
 no certainty over whether this may cause later issues.
SUCCESS
DJANGO ADMIN PAGES

• Add ‘django.contrib.admin’ to   INSTALLED_APPS in the file
 ‘mysite/settings.py’.

• Add  (r'^admin/', include(admin.site.urls)) to 'urlpatterns’ in the
 file ‘mysite/urls.py’.

• Configure ‘DATABASES’ in     the file ‘mysite/settings.py’.

• Synchronise   database model.
 python mysite/manage.py syncdb
SUCCESS
NOT FOUND
STATIC MEDIA FILES

• Django’s
         static media files are only served automatically by the
 Django development server and not when using Django
 WSGIHandler object.

• Mustmanually map any static media files to appropriate sub
 URL in Apache.
ALLOW FROM ALL
WSGIScriptAlias / /home/grumpy/example-2/apache/mysite.wsgi

<Directory /home/grumpy/example-2/apache>
Order deny,allow
Allow from all
</Directory>

Alias /media/ /home/grumpy/example-2/media/

<Directory /home/grumpy/example-2/media/>
Order deny,allow
Allow from all
</Directory>
SUCCESS
SUMMARY OF MAIN POINTS

• Need   to tell Apache what resources it should allow access to.

• Apache   user needs access to WSGI script file/directory.

• Application   user needs read access to source code.

• Application   user needs to be able to write to data directories.

• Python   needs to know where to search for modules/packages.
ONLINE RESOURCES
• The   mod_wsgi documentation.

 http://www.modwsgi.org

 http://code.google.com/p/modwsgi/wiki/WhereToGetHelp
 http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
 http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

• Personal   blog posts.

 http://blog.dscpl.com.au

More Related Content

What's hot

AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
Amazon Web Services Japan
 
スマホアプリのSSLサーバ証明書の検証不備について
スマホアプリのSSLサーバ証明書の検証不備についてスマホアプリのSSLサーバ証明書の検証不備について
スマホアプリのSSLサーバ証明書の検証不備について
Shunsuke Taniguchi
 
[AWSマイスターシリーズ] Instance Store & Elastic Block Store
[AWSマイスターシリーズ] Instance Store & Elastic Block Store[AWSマイスターシリーズ] Instance Store & Elastic Block Store
[AWSマイスターシリーズ] Instance Store & Elastic Block Store
Amazon Web Services Japan
 
Azure仮想マシンと仮想ネットワーク
Azure仮想マシンと仮想ネットワークAzure仮想マシンと仮想ネットワーク
Azure仮想マシンと仮想ネットワーク
Kuninobu SaSaki
 

What's hot (20)

Introduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and DracutIntroduction to Initramfs - Initramfs-tools and Dracut
Introduction to Initramfs - Initramfs-tools and Dracut
 
AWSスポットインスタンスの真髄
AWSスポットインスタンスの真髄AWSスポットインスタンスの真髄
AWSスポットインスタンスの真髄
 
INF-012_デスクトップ仮想化の実践 ~powered by Windows Server 2016 & Azure~
INF-012_デスクトップ仮想化の実践 ~powered by Windows Server 2016 & Azure~INF-012_デスクトップ仮想化の実践 ~powered by Windows Server 2016 & Azure~
INF-012_デスクトップ仮想化の実践 ~powered by Windows Server 2016 & Azure~
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
 
時代はサーバレスだけど Amazon Lightsailの話をする
時代はサーバレスだけど Amazon Lightsailの話をする時代はサーバレスだけど Amazon Lightsailの話をする
時代はサーバレスだけど Amazon Lightsailの話をする
 
Developers.IO 2019 Tokyo re:inventの歩き方
Developers.IO 2019 Tokyo re:inventの歩き方Developers.IO 2019 Tokyo re:inventの歩き方
Developers.IO 2019 Tokyo re:inventの歩き方
 
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
AWS Black Belt Online Seminar 2017 AWS体験ハンズオン~Deploy with EB CLI編~
 
スマホアプリのSSLサーバ証明書の検証不備について
スマホアプリのSSLサーバ証明書の検証不備についてスマホアプリのSSLサーバ証明書の検証不備について
スマホアプリのSSLサーバ証明書の検証不備について
 
[AWSマイスターシリーズ] Instance Store & Elastic Block Store
[AWSマイスターシリーズ] Instance Store & Elastic Block Store[AWSマイスターシリーズ] Instance Store & Elastic Block Store
[AWSマイスターシリーズ] Instance Store & Elastic Block Store
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
設計・構築においてのドキュメントの重要性について
設計・構築においてのドキュメントの重要性について設計・構築においてのドキュメントの重要性について
設計・構築においてのドキュメントの重要性について
 
Petit potam slides-rtfm-ossir
Petit potam slides-rtfm-ossirPetit potam slides-rtfm-ossir
Petit potam slides-rtfm-ossir
 
自宅サーバ仮想化
自宅サーバ仮想化自宅サーバ仮想化
自宅サーバ仮想化
 
Ansible勉強会資料
Ansible勉強会資料Ansible勉強会資料
Ansible勉強会資料
 
Azure仮想マシンと仮想ネットワーク
Azure仮想マシンと仮想ネットワークAzure仮想マシンと仮想ネットワーク
Azure仮想マシンと仮想ネットワーク
 
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
 
Tuning TCP and NGINX on EC2
Tuning TCP and NGINX on EC2Tuning TCP and NGINX on EC2
Tuning TCP and NGINX on EC2
 
Sec013 その資格情報、簡
Sec013 その資格情報、簡Sec013 その資格情報、簡
Sec013 その資格情報、簡
 
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
 
Selenium WebDriver com Docker
Selenium WebDriver com DockerSelenium WebDriver com Docker
Selenium WebDriver com Docker
 

Viewers also liked

A Brief Introduce to WSGI
A Brief Introduce to WSGIA Brief Introduce to WSGI
A Brief Introduce to WSGI
Mingli Yuan
 
Data analytics in the cloud with Jupyter notebooks.
Data analytics in the cloud with Jupyter notebooks.Data analytics in the cloud with Jupyter notebooks.
Data analytics in the cloud with Jupyter notebooks.
Graham Dumpleton
 

Viewers also liked (6)

PyCon NZ 2013 - Advanced Methods For Creating Decorators
PyCon NZ 2013 - Advanced Methods For Creating DecoratorsPyCon NZ 2013 - Advanced Methods For Creating Decorators
PyCon NZ 2013 - Advanced Methods For Creating Decorators
 
PyCon AU 2015 - Using benchmarks to understand how wsgi servers work
PyCon AU 2015  - Using benchmarks to understand how wsgi servers workPyCon AU 2015  - Using benchmarks to understand how wsgi servers work
PyCon AU 2015 - Using benchmarks to understand how wsgi servers work
 
PyCon HK 2015 - Monitoring the performance of python web applications
PyCon HK 2015 -  Monitoring the performance of python web applicationsPyCon HK 2015 -  Monitoring the performance of python web applications
PyCon HK 2015 - Monitoring the performance of python web applications
 
Python WSGI introduction
Python WSGI introductionPython WSGI introduction
Python WSGI introduction
 
A Brief Introduce to WSGI
A Brief Introduce to WSGIA Brief Introduce to WSGI
A Brief Introduce to WSGI
 
Data analytics in the cloud with Jupyter notebooks.
Data analytics in the cloud with Jupyter notebooks.Data analytics in the cloud with Jupyter notebooks.
Data analytics in the cloud with Jupyter notebooks.
 

Similar to PyCon AU 2010 - Getting Started With Apache/mod_wsgi.

Deploying
DeployingDeploying
Deploying
soon
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
andymccurdy
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
Joe Ray
 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabric
andymccurdy
 

Similar to PyCon AU 2010 - Getting Started With Apache/mod_wsgi. (20)

Deploying
DeployingDeploying
Deploying
 
Pyramid Deployment and Maintenance
Pyramid Deployment and MaintenancePyramid Deployment and Maintenance
Pyramid Deployment and Maintenance
 
“warpdrive”, making Python web application deployment magically easy.
“warpdrive”, making Python web application deployment magically easy.“warpdrive”, making Python web application deployment magically easy.
“warpdrive”, making Python web application deployment magically easy.
 
Django
DjangoDjango
Django
 
Deploying Django with Ansible
Deploying Django with AnsibleDeploying Django with Ansible
Deploying Django with Ansible
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
 
WPDay Bologna 2013
WPDay Bologna 2013WPDay Bologna 2013
WPDay Bologna 2013
 
Oracle API Gateway Installation
Oracle API Gateway InstallationOracle API Gateway Installation
Oracle API Gateway Installation
 
Manage WordPress with Awesome using wp cli
Manage WordPress with Awesome using wp cliManage WordPress with Awesome using wp cli
Manage WordPress with Awesome using wp cli
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabric
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
 
[Devconf.cz][2017] Understanding OpenShift Security Context Constraints
[Devconf.cz][2017] Understanding OpenShift Security Context Constraints[Devconf.cz][2017] Understanding OpenShift Security Context Constraints
[Devconf.cz][2017] Understanding OpenShift Security Context Constraints
 
WordCamp Vancouver 2012 - Manage WordPress with Awesome using wp-cli
WordCamp Vancouver 2012 - Manage WordPress with Awesome using wp-cliWordCamp Vancouver 2012 - Manage WordPress with Awesome using wp-cli
WordCamp Vancouver 2012 - Manage WordPress with Awesome using wp-cli
 
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint Workshop
 
Vagrant WordCamp Hamilton
Vagrant  WordCamp HamiltonVagrant  WordCamp Hamilton
Vagrant WordCamp Hamilton
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
 

More from Graham Dumpleton

PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2
Graham Dumpleton
 
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance TuningPyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
Graham Dumpleton
 
DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
Graham Dumpleton
 

More from Graham Dumpleton (10)

Implementing a decorator for thread synchronisation.
Implementing a decorator for thread synchronisation.Implementing a decorator for thread synchronisation.
Implementing a decorator for thread synchronisation.
 
Not Tom Eastman
Not Tom EastmanNot Tom Eastman
Not Tom Eastman
 
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
 
OpenShift, Docker, Kubernetes: The next generation of PaaS
OpenShift, Docker, Kubernetes: The next generation of PaaSOpenShift, Docker, Kubernetes: The next generation of PaaS
OpenShift, Docker, Kubernetes: The next generation of PaaS
 
Automated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and KubernetesAutomated Image Builds in OpenShift and Kubernetes
Automated Image Builds in OpenShift and Kubernetes
 
PyCon US 2013 Making Apache suck less for hosting Python web applications
PyCon US 2013 Making Apache suck less for hosting Python web applicationsPyCon US 2013 Making Apache suck less for hosting Python web applications
PyCon US 2013 Making Apache suck less for hosting Python web applications
 
PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2
 
PyCon AU 2012 - Debugging Live Python Web Applications
PyCon AU 2012 - Debugging Live Python Web ApplicationsPyCon AU 2012 - Debugging Live Python Web Applications
PyCon AU 2012 - Debugging Live Python Web Applications
 
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance TuningPyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
 
DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
 

Recently uploaded

Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
UXDXConf
 

Recently uploaded (20)

PLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. StartupsPLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. Startups
 
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfThe Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
 
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
 
Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
 
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptxBT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
 
Designing for Hardware Accessibility at Comcast
Designing for Hardware Accessibility at ComcastDesigning for Hardware Accessibility at Comcast
Designing for Hardware Accessibility at Comcast
 
Using IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & IrelandUsing IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & Ireland
 
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
 
Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
 
WebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceWebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM Performance
 
How we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdfHow we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdf
 

PyCon AU 2010 - Getting Started With Apache/mod_wsgi.

  • 1. GETTING STARTED WITH MOD_WSGI Graham Dumpleton PyCon Australia June 2010
  • 2. WHAT IS WSGI? • Specification for an interface between web servers and Python web applications or frameworks. • Intended to promote web application portability across a variety of web servers. • PEP 333 - http://www.python.org/dev/peps/pep-0333 • More Information - http://www.wsgi.org
  • 3. WHAT IS MOD_WSGI? • An Apache module to support hosting WSGI applications in conjunction with the Apache web server. • Interceptsrequests to designated URLs and passes requests off to the WSGI application specified in the target WSGI script file that the URL maps to.
  • 4. HELLO WORLD def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
  • 5. MAPPING A URL • Mapping WSGI application at root of web server. WSGIScriptAlias / /home/grumpy/example-1/hello.wsgi • Mapping WSGI application at sub URL of web server. WSGIScriptAlias /suburl /home/grumpy/example-1/hello.wsgi
  • 6. FORBIDDEN client denied by server configuration: /home/grumpy/example-1/hello.wsgi
  • 7. DENY FROM ALL • By default Apache denies access to everything. <Directory /> Order deny,allow Deny from all </Directory> • Thus we need to open up access to our script. <Directory /home/grumpy/example-1> Order deny,allow Allow from all </Directory>
  • 9. DRWXR-X--- • Apache server child processes runs as a special user. • The Apacheuser must be able to search directories down to where the WSGI script file is located. • User account home directories often have permissions of drwxr-x--- and access is thereby restricted. • Make directories accessable to others. chmod o+rx /home/grumpy • Better still, don’t put WSGI script files under home directories.
  • 10. INTERNAL SERVER ERROR (13)Permission denied: mod_wsgi (pid=666, process='', application='tests.example.com|'): Call to fopen() failed for '/home/ grumpy/example-1/echo.wsgi'.
  • 11. -RW-R----- • Apache server child processes runs as a special user. • The Apache user must be able to read the WSGI script file. •A user account umask of 0007 will result in files being created with permissions of -rw-r----- and access is thereby restricted. • Make files readable to others. chmod o+r /home/grumpy/example-1/hello.wsgi
  • 13. DJANGO APPLICATION • Install Django. • Create an empty project. mkdir /home/grumpy/example-2 cd /home/grumpy/example-2 django-admin.py startproject mysite • Run the Django development server. python mysite/manage.py runserver
  • 15. DJANGO WSGI SCRIPT import os import sys os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
  • 16. DJANGO APACHE CONFIG WSGIScriptAlias / /home/grumpy/example-2/apache/mysite.wsgi <Directory /home/grumpy/example-2/apache> Order deny,allow Allow from all </Directory>
  • 17. INTERNAL SERVER ERROR raise ImportError("Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'mysite.settings' (Is it on sys.path? Does it have syntax errors?): No module named mysite.settings
  • 18. SYS.PATH • Pythonmodules/packages are not imported relative to current working directory. • Python modules/packages are not imported relative to the directory containing the WSGI script file. • The PYTHONPATH of the user who owns the WSGI script file is not consulted. • Therefore must explicitly designate directories to search for Python modules/packages.
  • 19. SYS.PATH.INSERT() import os import sys root = os.path.join(os.path.dirname(__file__), '..') sys.path.insert(0, root) os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
  • 21. VIRTUAL ENVIRONMENT • Create and activate virtual environment cd /home/grumpy/example-2 virtualenv --no-site-packages environ source environ/bin/activate • Install Django and other required packages. easy_install Django
  • 23. INTERNAL SERVER ERROR ImportError: No module named django.core.handlers.wsgi
  • 24. SYS.PATH.INSERT() import os import sys root = os.path.join(os.path.dirname(__file__), '..') sys.path.insert(0, root) packages = os.path.join(root, 'environ/lib/python2.6/site-packages' sys.path.insert(0, packages) os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
  • 25. SITE.ADDSITEDIR() import os import sys import site root = os.path.join(os.path.dirname(__file__), '..') sys.path.insert(0, root) packages = os.path.join(root, 'environ/lib/python2.6/site-packages' site.addsitedir(packages) os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
  • 26. ACTIVATE THIS import os import sys root = os.path.join(os.path.dirname(__file__), '..') sys.path.insert(0, root) activate_this = os.path.join(root, 'environ/bin/activate_this.py') execfile(activate_this, dict(__file__=activate_this)) os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
  • 27. SITE-PACKAGES • Using sys.path.insert() allows directory to be placed first, but .pth files do not get processed. • Using site.addsitedir() results in .pth files being processed, but new directories get placed last. • Using activate_this.py results in .pth files being processed and sys.path reordered such that new directories get placed first. • Value of sys.prefix is however altered by activate_this.py and no certainty over whether this may cause later issues.
  • 29. DJANGO ADMIN PAGES • Add ‘django.contrib.admin’ to INSTALLED_APPS in the file ‘mysite/settings.py’. • Add (r'^admin/', include(admin.site.urls)) to 'urlpatterns’ in the file ‘mysite/urls.py’. • Configure ‘DATABASES’ in the file ‘mysite/settings.py’. • Synchronise database model. python mysite/manage.py syncdb
  • 32. STATIC MEDIA FILES • Django’s static media files are only served automatically by the Django development server and not when using Django WSGIHandler object. • Mustmanually map any static media files to appropriate sub URL in Apache.
  • 33. ALLOW FROM ALL WSGIScriptAlias / /home/grumpy/example-2/apache/mysite.wsgi <Directory /home/grumpy/example-2/apache> Order deny,allow Allow from all </Directory> Alias /media/ /home/grumpy/example-2/media/ <Directory /home/grumpy/example-2/media/> Order deny,allow Allow from all </Directory>
  • 35. SUMMARY OF MAIN POINTS • Need to tell Apache what resources it should allow access to. • Apache user needs access to WSGI script file/directory. • Application user needs read access to source code. • Application user needs to be able to write to data directories. • Python needs to know where to search for modules/packages.
  • 36. ONLINE RESOURCES • The mod_wsgi documentation. http://www.modwsgi.org http://code.google.com/p/modwsgi/wiki/WhereToGetHelp http://code.google.com/p/modwsgi/wiki/VirtualEnvironments http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode • Personal blog posts. http://blog.dscpl.com.au

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n