fastcgi.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. ============================================
  2. How to use Django with FastCGI, SCGI, or AJP
  3. ============================================
  4. .. highlight:: bash
  5. Although the current preferred setup for running Django is :doc:`Apache with
  6. mod_wsgi </howto/deployment/modwsgi>`, many people use shared hosting, on
  7. which protocols such as FastCGI, SCGI or AJP are the only viable options. In
  8. some setups, these protocols may provide better performance than mod_wsgi_.
  9. .. admonition:: Note
  10. This document primarily focuses on FastCGI. Other protocols, such as SCGI
  11. and AJP, are also supported, through the ``flup`` Python package. See the
  12. Protocols_ section below for specifics about SCGI and AJP.
  13. Essentially, FastCGI is an efficient way of letting an external application
  14. serve pages to a Web server. The Web server delegates the incoming Web requests
  15. (via a socket) to FastCGI, which executes the code and passes the response back
  16. to the Web server, which, in turn, passes it back to the client's Web browser.
  17. Like mod_wsgi, FastCGI allows code to stay in memory, allowing requests to be
  18. served with no startup time. While mod_wsgi can either be configured embedded
  19. in the Apache Web server process or as a separate daemon process, a FastCGI
  20. process never runs inside the Web server process, always in a separate,
  21. persistent process.
  22. .. _mod_wsgi: http://code.google.com/p/modwsgi/
  23. .. _mod_perl: http://perl.apache.org/
  24. .. admonition:: Why run code in a separate process?
  25. The traditional ``mod_*`` arrangements in Apache embed various scripting
  26. languages (most notably PHP, Python and Perl) inside the process space of
  27. your Web server. Although this lowers startup time -- because code doesn't
  28. have to be read off disk for every request -- it comes at the cost of
  29. memory use.
  30. Due to the nature of FastCGI, it's even possible to have processes that run
  31. under a different user account than the Web server process. That's a nice
  32. security benefit on shared systems, because it means you can secure your
  33. code from other users.
  34. Prerequisite: flup
  35. ==================
  36. Before you can start using FastCGI with Django, you'll need to install flup_, a
  37. Python library for dealing with FastCGI. Version 0.5 or newer should work fine.
  38. .. _flup: http://www.saddi.com/software/flup/
  39. Starting your FastCGI server
  40. ============================
  41. FastCGI operates on a client-server model, and in most cases you'll be starting
  42. the FastCGI process on your own. Your Web server (be it Apache, lighttpd, or
  43. otherwise) only contacts your Django-FastCGI process when the server needs a
  44. dynamic page to be loaded. Because the daemon is already running with the code
  45. in memory, it's able to serve the response very quickly.
  46. .. admonition:: Note
  47. If you're on a shared hosting system, you'll probably be forced to use
  48. Web server-managed FastCGI processes. See the section below on running
  49. Django with Web server-managed processes for more information.
  50. A Web server can connect to a FastCGI server in one of two ways: It can use
  51. either a Unix domain socket (a "named pipe" on Win32 systems), or it can use a
  52. TCP socket. What you choose is a manner of preference; a TCP socket is usually
  53. easier due to permissions issues.
  54. To start your server, first change into the directory of your project (wherever
  55. your :doc:`manage.py </ref/django-admin>` is), and then run the
  56. :djadmin:`runfcgi` command::
  57. ./manage.py runfcgi [options]
  58. If you specify ``help`` as the only option after :djadmin:`runfcgi`, it'll
  59. display a list of all the available options.
  60. You'll need to specify either a ``socket``, a ``protocol`` or both ``host`` and
  61. ``port``. Then, when you set up your Web server, you'll just need to point it at
  62. the host/port or socket you specified when starting the FastCGI server. See the
  63. examples_, below.
  64. Protocols
  65. ---------
  66. Django supports all the protocols that flup_ does, namely fastcgi_, `SCGI`_ and
  67. `AJP1.3`_ (the Apache JServ Protocol, version 1.3). Select your preferred
  68. protocol by using the ``protocol=<protocol_name>`` option with ``./manage.py
  69. runfcgi`` -- where ``<protocol_name>`` may be one of: ``fcgi`` (the default),
  70. ``scgi`` or ``ajp``. For example::
  71. ./manage.py runfcgi protocol=scgi
  72. .. _flup: http://www.saddi.com/software/flup/
  73. .. _fastcgi: http://www.fastcgi.com/
  74. .. _SCGI: http://python.ca/scgi/protocol.txt
  75. .. _AJP1.3: http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html
  76. Examples
  77. --------
  78. Running a threaded server on a TCP port::
  79. ./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
  80. Running a preforked server on a Unix domain socket::
  81. ./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
  82. Run without daemonizing (backgrounding) the process (good for debugging)::
  83. ./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock maxrequests=1
  84. Stopping the FastCGI daemon
  85. ---------------------------
  86. If you have the process running in the foreground, it's easy enough to stop it:
  87. Simply hitting ``Ctrl-C`` will stop and quit the FastCGI server. However, when
  88. you're dealing with background processes, you'll need to resort to the Unix
  89. ``kill`` command.
  90. If you specify the ``pidfile`` option to :djadmin:`runfcgi`, you can kill the
  91. running FastCGI daemon like this::
  92. kill `cat $PIDFILE`
  93. ...where ``$PIDFILE`` is the ``pidfile`` you specified.
  94. To easily restart your FastCGI daemon on Unix, try this small shell script::
  95. #!/bin/bash
  96. # Replace these three settings.
  97. PROJDIR="/home/user/myproject"
  98. PIDFILE="$PROJDIR/mysite.pid"
  99. SOCKET="$PROJDIR/mysite.sock"
  100. cd $PROJDIR
  101. if [ -f $PIDFILE ]; then
  102. kill `cat -- $PIDFILE`
  103. rm -f -- $PIDFILE
  104. fi
  105. exec /usr/bin/env - \
  106. PYTHONPATH="../python:.." \
  107. ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
  108. Apache setup
  109. ============
  110. To use Django with Apache and FastCGI, you'll need Apache installed and
  111. configured, with `mod_fastcgi`_ installed and enabled. Consult the Apache
  112. documentation for instructions.
  113. Once you've got that set up, point Apache at your Django FastCGI instance by
  114. editing the ``httpd.conf`` (Apache configuration) file. You'll need to do two
  115. things:
  116. * Use the ``FastCGIExternalServer`` directive to specify the location of
  117. your FastCGI server.
  118. * Use ``mod_rewrite`` to point URLs at FastCGI as appropriate.
  119. .. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
  120. Specifying the location of the FastCGI server
  121. ---------------------------------------------
  122. The ``FastCGIExternalServer`` directive tells Apache how to find your FastCGI
  123. server. As the `FastCGIExternalServer docs`_ explain, you can specify either a
  124. ``socket`` or a ``host``. Here are examples of both:
  125. .. code-block:: apache
  126. # Connect to FastCGI via a socket / named pipe.
  127. FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
  128. # Connect to FastCGI via a TCP host/port.
  129. FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
  130. In either case, the file ``/home/user/public_html/mysite.fcgi`` doesn't
  131. actually have to exist. It's just a URL used by the Web server internally -- a
  132. hook for signifying which requests at a URL should be handled by FastCGI. (More
  133. on this in the next section.)
  134. .. _FastCGIExternalServer docs: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer
  135. Using mod_rewrite to point URLs at FastCGI
  136. ------------------------------------------
  137. The second step is telling Apache to use FastCGI for URLs that match a certain
  138. pattern. To do this, use the `mod_rewrite`_ module and rewrite URLs to
  139. ``mysite.fcgi`` (or whatever you specified in the ``FastCGIExternalServer``
  140. directive, as explained in the previous section).
  141. In this example, we tell Apache to use FastCGI to handle any request that
  142. doesn't represent a file on the filesystem and doesn't start with ``/media/``.
  143. This is probably the most common case, if you're using Django's admin site:
  144. .. code-block:: apache
  145. <VirtualHost 12.34.56.78>
  146. ServerName example.com
  147. DocumentRoot /home/user/public_html
  148. Alias /media /home/user/python/django/contrib/admin/media
  149. RewriteEngine On
  150. RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
  151. RewriteCond %{REQUEST_FILENAME} !-f
  152. RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
  153. </VirtualHost>
  154. .. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
  155. Django will automatically use the pre-rewrite version of the URL when
  156. constructing URLs with the ``{% url %}`` template tag (and similar methods).
  157. lighttpd setup
  158. ==============
  159. lighttpd_ is a lightweight Web server commonly used for serving static files. It
  160. supports FastCGI natively and, thus, is a good choice for serving both static
  161. and dynamic pages, if your site doesn't have any Apache-specific needs.
  162. .. _lighttpd: http://www.lighttpd.net/
  163. Make sure ``mod_fastcgi`` is in your modules list, somewhere after
  164. ``mod_rewrite`` and ``mod_access``, but not after ``mod_accesslog``. You'll
  165. probably want ``mod_alias`` as well, for serving admin media.
  166. Add the following to your lighttpd config file:
  167. .. code-block:: lua
  168. server.document-root = "/home/user/public_html"
  169. fastcgi.server = (
  170. "/mysite.fcgi" => (
  171. "main" => (
  172. # Use host / port instead of socket for TCP fastcgi
  173. # "host" => "127.0.0.1",
  174. # "port" => 3033,
  175. "socket" => "/home/user/mysite.sock",
  176. "check-local" => "disable",
  177. )
  178. ),
  179. )
  180. alias.url = (
  181. "/media" => "/home/user/django/contrib/admin/media/",
  182. )
  183. url.rewrite-once = (
  184. "^(/media.*)$" => "$1",
  185. "^/favicon\.ico$" => "/media/favicon.ico",
  186. "^(/.*)$" => "/mysite.fcgi$1",
  187. )
  188. Running multiple Django sites on one lighttpd
  189. ---------------------------------------------
  190. lighttpd lets you use "conditional configuration" to allow configuration to be
  191. customized per host. To specify multiple FastCGI sites, just add a conditional
  192. block around your FastCGI config for each site::
  193. # If the hostname is 'www.example1.com'...
  194. $HTTP["host"] == "www.example1.com" {
  195. server.document-root = "/foo/site1"
  196. fastcgi.server = (
  197. ...
  198. )
  199. ...
  200. }
  201. # If the hostname is 'www.example2.com'...
  202. $HTTP["host"] == "www.example2.com" {
  203. server.document-root = "/foo/site2"
  204. fastcgi.server = (
  205. ...
  206. )
  207. ...
  208. }
  209. You can also run multiple Django installations on the same site simply by
  210. specifying multiple entries in the ``fastcgi.server`` directive. Add one
  211. FastCGI host for each.
  212. Cherokee setup
  213. ==============
  214. Cherokee is a very fast, flexible and easy to configure Web Server. It
  215. supports the widespread technologies nowadays: FastCGI, SCGI, PHP, CGI, SSI,
  216. TLS and SSL encrypted connections, Virtual hosts, Authentication, on the fly
  217. encoding, Load Balancing, Apache compatible log files, Data Base Balancer,
  218. Reverse HTTP Proxy and much more.
  219. The Cherokee project provides a documentation to `setting up Django`_ with Cherokee.
  220. .. _setting up Django: http://www.cherokee-project.com/doc/cookbook_django.html
  221. Running Django on a shared-hosting provider with Apache
  222. =======================================================
  223. Many shared-hosting providers don't allow you to run your own server daemons or
  224. edit the ``httpd.conf`` file. In these cases, it's still possible to run Django
  225. using Web server-spawned processes.
  226. .. admonition:: Note
  227. If you're using Web server-spawned processes, as explained in this section,
  228. there's no need for you to start the FastCGI server on your own. Apache
  229. will spawn a number of processes, scaling as it needs to.
  230. In your Web root directory, add this to a file named ``.htaccess``:
  231. .. code-block:: apache
  232. AddHandler fastcgi-script .fcgi
  233. RewriteEngine On
  234. RewriteCond %{REQUEST_FILENAME} !-f
  235. RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
  236. Then, create a small script that tells Apache how to spawn your FastCGI
  237. program. Create a file ``mysite.fcgi`` and place it in your Web directory, and
  238. be sure to make it executable:
  239. .. code-block:: python
  240. #!/usr/bin/python
  241. import sys, os
  242. # Add a custom Python path.
  243. sys.path.insert(0, "/home/user/python")
  244. # Switch to the directory of your project. (Optional.)
  245. # os.chdir("/home/user/myproject")
  246. # Set the DJANGO_SETTINGS_MODULE environment variable.
  247. os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
  248. from django.core.servers.fastcgi import runfastcgi
  249. runfastcgi(method="threaded", daemonize="false")
  250. Restarting the spawned server
  251. -----------------------------
  252. If you change any Python code on your site, you'll need to tell FastCGI the
  253. code has changed. But there's no need to restart Apache in this case. Rather,
  254. just reupload ``mysite.fcgi``, or edit the file, so that the timestamp on the
  255. file will change. When Apache sees the file has been updated, it will restart
  256. your Django application for you.
  257. If you have access to a command shell on a Unix system, you can accomplish this
  258. easily by using the ``touch`` command::
  259. touch mysite.fcgi
  260. Serving admin media files
  261. =========================
  262. Regardless of the server and configuration you eventually decide to use, you
  263. will also need to give some thought to how to serve the admin media files. The
  264. advice given in the :ref:`mod_wsgi <serving-the-admin-files>` documentation
  265. is also applicable in the setups detailed above.
  266. Forcing the URL prefix to a particular value
  267. ============================================
  268. Because many of these fastcgi-based solutions require rewriting the URL at
  269. some point inside the Web server, the path information that Django sees may not
  270. resemble the original URL that was passed in. This is a problem if the Django
  271. application is being served from under a particular prefix and you want your
  272. URLs from the ``{% url %}`` tag to look like the prefix, rather than the
  273. rewritten version, which might contain, for example, ``mysite.fcgi``.
  274. Django makes a good attempt to work out what the real script name prefix
  275. should be. In particular, if the Web server sets the ``SCRIPT_URL`` (specific
  276. to Apache's mod_rewrite), or ``REDIRECT_URL`` (set by a few servers, including
  277. Apache + mod_rewrite in some situations), Django will work out the original
  278. prefix automatically.
  279. In the cases where Django cannot work out the prefix correctly and where you
  280. want the original value to be used in URLs, you can set the
  281. ``FORCE_SCRIPT_NAME`` setting in your main ``settings`` file. This sets the
  282. script name uniformly for every URL served via that settings file. Thus you'll
  283. need to use different settings files if you want different sets of URLs to
  284. have different script names in this case, but that is a rare situation.
  285. As an example of how to use it, if your Django configuration is serving all of
  286. the URLs under ``'/'`` and you wanted to use this setting, you would set
  287. ``FORCE_SCRIPT_NAME = ''`` in your settings file.