fastcgi.txt 16 KB

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