Changes between Version 1 and Version 2 of TracModPython


Ignore:
Timestamp:
09/14/17 14:47:49 (7 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracModPython

    v1 v2  
     1[[TracGuideToc]]
     2
    13= Trac and mod_python
    2 [[TracGuideToc]]
    34
    45Mod_python is an [https://httpd.apache.org/ Apache] module that embeds the Python interpreter within the server, so that web-based applications in Python will run many times faster than traditional CGI and will have the ability to retain database connections.
    56Trac supports [http://www.modpython.org/ mod_python], which speeds up Trac's response times considerably, especially compared to [TracCgi CGI], and permits use of many Apache features not possible with [wiki:TracStandalone tracd]/mod_proxy.
    67
    7 These instructions are for Apache 2. If you are using Apache 1.3, you may have some luck with [trac:wiki:TracModPython2.7 TracModPython2.7], but that is a deprecated setup.
    8 
    98[[PageOutline(2-3,Overview,inline)]]
    109
    11 == Simple configuration: single project == #Simpleconfiguration
     10== Simple configuration: single project #Simpleconfiguration
    1211
    1312If you just installed mod_python, you may have to add a line to load the module in the Apache configuration:
    14 {{{
     13{{{#!apache
    1514LoadModule python_module modules/mod_python.so
    1615}}}
    1716
    18 ''Note: The exact path to the module depends on how the HTTPD installation is laid out.''
     17'''Note''': The exact path to the module depends on how the HTTPD installation is laid out.
    1918
    2019On Debian using apt-get:
    21 {{{
     20{{{#!sh
    2221apt-get install libapache2-mod-python libapache2-mod-python-doc
    2322}}}
     23
    2424Still on Debian, after you have installed mod_python, you must enable the modules in apache2, equivalent to the above Load Module directive:
    25 {{{
     25{{{#!sh
    2626a2enmod python
    2727}}}
     28
    2829On Fedora use, using yum:
    29 {{{
     30{{{#!sh
    3031yum install mod_python
    3132}}}
     33
    3234You can test your mod_python installation by adding the following to your httpd.conf. You should remove this when you are done testing for security reasons. Note: mod_python.testhandler is only available in mod_python 3.2+.
    33 {{{
    34 #!xml
     35{{{#!apache
    3536<Location /mpinfo>
    36    SetHandler mod_python
    37    PythonInterpreter main_interpreter
    38    PythonHandler mod_python.testhandler
    39    Order allow,deny
    40    Allow from all
     37  SetHandler mod_python
     38  PythonInterpreter main_interpreter
     39  PythonHandler mod_python.testhandler
     40  # For Apache 2.2
     41  <IfModule !mod_authz_core.c>
     42    Order allow,deny
     43    Allow from all
     44  </IfModule>
     45  # For Apache 2.4
     46  <IfModule mod_authz_core.c>
     47    Require all granted
     48  </IfModule>
    4149</Location>
    4250}}}
    4351
    4452A simple setup of Trac on mod_python looks like this:
    45 {{{
    46 #!xml
     53{{{#!apache
    4754<Location /projects/myproject>
    48    SetHandler mod_python
    49    PythonInterpreter main_interpreter
    50    PythonHandler trac.web.modpython_frontend
    51    PythonOption TracEnv /var/trac/myproject
    52    PythonOption TracUriRoot /projects/myproject
    53    Order allow,deny
    54    Allow from all
     55  SetHandler mod_python
     56  PythonInterpreter main_interpreter
     57  PythonHandler trac.web.modpython_frontend
     58  PythonOption TracEnv /var/trac/myproject
     59  PythonOption TracUriRoot /projects/myproject
     60  # For Apache 2.2
     61  <IfModule !mod_authz_core.c>
     62    Order allow,deny
     63    Allow from all
     64  </IfModule>
     65  # For Apache 2.4
     66  <IfModule mod_authz_core.c>
     67    Require all granted
     68  </IfModule>
    5569</Location>
    5670}}}
     
    5973
    6074The options available are:
    61 {{{
    62     # For a single project
    63     PythonOption TracEnv /var/trac/myproject
    64 
    65     # For multiple projects
    66     PythonOption TracEnvParentDir /var/trac/myprojects
    67 
    68     # For the index of multiple projects
    69     PythonOption TracEnvIndexTemplate /srv/www/htdocs/trac/project_list_template.html
    70 
    71     # A space delimitted list, with a "," between key and value pairs.
    72     PythonOption TracTemplateVars key1,val1 key2,val2
    73 
    74     # Useful to get the date in the wanted order
    75     PythonOption TracLocale en_GB.UTF8
    76 
    77     # See description above       
    78     PythonOption TracUriRoot /projects/myproject
     75{{{#!apache
     76# For a single project
     77PythonOption TracEnv /var/trac/myproject
     78
     79# For multiple projects
     80PythonOption TracEnvParentDir /var/trac/myprojects
     81
     82# For the index of multiple projects
     83PythonOption TracEnvIndexTemplate /srv/www/htdocs/trac/project_list_template.html
     84
     85# A space delimitted list, with a "," between key and value pairs.
     86PythonOption TracTemplateVars key1,val1 key2,val2
     87
     88# Useful to get the date in the wanted order
     89PythonOption TracLocale en_GB.UTF8
     90
     91# See description above       
     92PythonOption TracUriRoot /projects/myproject
    7993}}}
    8094
    8195=== Python Egg Cache
    8296
    83 Compressed python eggs like Genshi are normally extracted into a directory named `.python-eggs` in the users home directory. Since apache's home usually is not writable, an alternate egg cache directory can be specified like this:
    84 {{{
     97Compressed Python eggs like Genshi are normally extracted into a directory named `.python-eggs` in the users home directory. Since Apache's home usually is not writeable, an alternate egg cache directory can be specified like this:
     98{{{#!apache
    8599PythonOption PYTHON_EGG_CACHE /var/trac/myprojects/egg-cache
    86100}}}
    87101
    88 or you can uncompress the Genshi egg to resolve problems extracting from it.
     102Or you can uncompress the Genshi egg to resolve problems extracting from it.
    89103
    90104=== Configuring Authentication
     
    96110=== Setting the Python Egg Cache
    97111
    98 If the Egg Cache isn't writeable by your Web server, you'll either have to change the permissions, or point Python to a location where Apache can write. This can manifest itself as a ''500 internal server error'' and/or a complaint in the syslog.
    99 
    100 {{{
    101 #!xml
     112If the Egg Cache isn't writeable by your Web server, you'll either have to change the permissions, or point Python to a location where Apache can write. This can manifest itself as a `500 internal server error` and/or a complaint in the syslog.
     113
     114{{{#!apache
    102115<Location /projects/myproject>
    103116  ...
     
    109122=== Setting the !PythonPath
    110123
    111 If the Trac installation isn't installed in your Python path, you'll have to tell Apache where to find the Trac mod_python handler  using the `PythonPath` directive:
    112 {{{
    113 #!xml
     124If the Trac installation isn't installed in your Python path, you will have to tell Apache where to find the Trac mod_python handler  using the `PythonPath` directive:
     125{{{#!apache
    114126<Location /projects/myproject>
    115127  ...
     
    124136
    125137The Trac mod_python handler supports a configuration option similar to Subversion's `SvnParentPath`, called `TracEnvParentDir`:
    126 {{{
    127 #!xml
     138{{{#!apache
    128139<Location /projects>
    129140  SetHandler mod_python
     
    138149
    139150If you don't want to have the subdirectory listing as your projects home page you can use a
    140 {{{
    141 #!xml
     151{{{#!apache
    142152<LocationMatch "/.+/">
    143153}}}
     
    146156
    147157You can also use the same authentication realm for all of the projects using a `<LocationMatch>` directive:
    148 {{{
    149 #!xml
     158{{{#!apache
    150159<LocationMatch "/projects/[^/]+/login">
    151160  AuthType Basic
     
    158167=== Virtual Host Configuration
    159168
    160 Below is the sample configuration required to set up your trac as a virtual server, ie when you access it at the URLs like
    161 !http://trac.mycompany.com:
    162 
    163 {{{
    164 #!xml
    165 <VirtualHost * >
     169Below is the sample configuration required to set up your Trac as a virtual server, ie when you access it at the URLs like
     170`http://trac.mycompany.com`:
     171
     172{{{#!apache
     173<VirtualHost *>
    166174    DocumentRoot /var/www/myproject
    167175    ServerName trac.mycompany.com
     
    183191
    184192This does not seem to work in all cases. What you can do if it does not:
    185  * Try using `<LocationMatch>` instead of `<Location>`
    186  * <Location /> may, in your server setup, refer to the complete host instead of simple the root of the server. This means that everything (including the login directory referenced below) will be sent to python and authentication does not work (i.e. you get the infamous Authentication information missing error). If this applies to you, try using a sub-directory for trac instead of the root, ie /web/ and /web/login instead of / and /login.
     193 * Try using `<LocationMatch>` instead of `<Location>`.
     194 * `<Location />` may, in your server setup, refer to the complete host instead of simple the root of the server. This means that everything (including the login directory referenced below) will be sent to Python and authentication does not work, ie you get the infamous Authentication information missing error. If this is the case, try using a sub-directory for Trac instead of the root, ie /web/ and /web/login instead of / and /login.
    187195 * Depending on apache's `NameVirtualHost` configuration, you may need to use `<VirtualHost *:80>` instead of `<VirtualHost *>`.
    188196
    189 For a virtual host that supports multiple projects replace "`TracEnv`" /var/trac/myproject with "`TracEnvParentDir`" /var/trac/
    190 
    191 Note: !DocumentRoot should not point to your Trac project env. As Asmodai wrote on #trac: "suppose there's a webserver bug that allows disclosure of !DocumentRoot they could then leech the entire Trac environment".
     197For a virtual host that supports multiple projects replace `TracEnv /var/trac/myproject` with `TracEnvParentDir /var/trac`.
     198
     199'''Note''': !DocumentRoot should not point to your Trac project env. As Asmodai wrote on #trac: "suppose there's a webserver bug that allows disclosure of !DocumentRoot they could then leech the entire Trac environment".
    192200
    193201== Troubleshooting
    194202
    195 In general, if you get server error pages, you can either check the Apache error log, or enable the `PythonDebug` option:
    196 {{{
    197 #!xml
     203If you get server error pages, you can either check the Apache error log, or enable the `PythonDebug` option:
     204{{{#!apache
    198205<Location /projects/myproject>
    199206  ...
     
    208215If you've used `<Location />` directive, it will override any other directives, as well as `<Location /login>`.
    209216The workaround is to use negation expression as follows (for multi project setups):
    210 {{{
    211 #!xml
     217{{{#!apache
    212218#this one for other pages
    213219<Location ~ "/*(?!login)">
     
    216222   PythonOption TracEnvParentDir /projects
    217223   PythonOption TracUriRoot /
    218 
    219 </Location>
     224</Location>
     225
    220226#this one for login page
    221227<Location ~ "/[^/]+/login">
     
    255261=== Problem with zipped egg
    256262
    257 It's possible that your version of mod_python will not import modules from zipped eggs. If you encounter an `ImportError: No module named trac` in your Apache logs but you think everything is where it should be, this might be your problem. Look in your site-packages directory; if the Trac module appears as a ''file'' rather than a ''directory'', then this might be your problem. To rectify, try installing Trac using the `--always-unzip` option, like this:
    258 
    259 {{{
     263It's possible that your version of mod_python will not import modules from zipped eggs. If you encounter an `ImportError: No module named trac` in your Apache logs but you think everything is where it should be, this might be your problem. Look in your site-packages directory; if the Trac module appears as a ''file'' rather than a ''directory'', then this might be your problem. To rectify this, try installing Trac using the `--always-unzip` option:
     264
     265{{{#!sh
    260266easy_install --always-unzip Trac-0.12b1.zip
    261267}}}
     
    268274
    269275This also works out-of-box, with following trivial config:
    270 {{{#!xml
     276{{{#!apache
    271277SetHandler mod_python
    272278PythonInterpreter main_interpreter
     
    281287}}}
    282288
    283 The `TracUriRoot` is obviously the path you need to enter to the browser to get to Trac, eg domain.tld/projects/trac.
     289The `TracUriRoot` is obviously the path you need to enter to the browser to get to Trac, eg `domain.tld/projects/trac`.
    284290
    285291=== Additional .htaccess help
    286292
    287 If you are using the .htaccess method you may have additional problems if your trac directory is inheriting .htaccess directives from another. This may also help to add to your .htaccess file:
    288 
    289 {{{
     293If you are using the .htaccess method you may have additional problems if your Trac directory is inheriting .htaccess directives from another. This may also help to add to your .htaccess file:
     294
     295{{{#!apache
    290296<IfModule mod_rewrite.c>
    291297  RewriteEngine Off
     
    296302==== Win32 Issues
    297303
    298 If you run trac with mod_python < 3.2 on Windows, uploading attachments will '''not''' work. This problem is resolved in mod_python 3.1.4 or later, so please upgrade mod_python to fix this.
     304If you run Trac with mod_python < 3.2 on Windows, uploading attachments will '''not''' work. This problem is resolved in mod_python 3.1.4 or later, so please upgrade mod_python to fix this.
    299305
    300306==== OS X issues
    301307
    302 When using mod_python on OS X you will not be able to restart Apache using `apachectl restart`. This is apparently fixed in mod_python 3.2, so please upgrade.
     308When using mod_python on OS X you will not be able to restart Apache using `apachectl restart`. This is apparently fixed in mod_python 3.2, so please upgrade mod_python to fix this.
    303309
    304310==== SELinux issues
    305311
    306 If Trac reports something like: ''Cannot get shared lock on db.lock''
    307 The security context on the repository may need to be set:
    308 
    309 {{{
     312If Trac reports something like: `Cannot get shared lock on db.lock`, then the security context on the repository may need to be set:
     313
     314{{{#!sh
    310315chcon -R -h -t httpd_sys_content_t PATH_TO_REPOSITORY
    311316}}}
     
    315320==== FreeBSD issues
    316321
    317 The FreeBSD ports have both the new and old versions of mod_python and SQLite, but earlier versions of pysqlite and mod_python won't integrate as the former requires threaded support in Python, and the latter requires a threadless install.
    318 
    319 If you compiled and installed apache2, threads are not automatically supported on FreeBSD. You could force thread support when running `./configure` for Apache, using `--enable-threads`, but this isn´t recommended.
     322The FreeBSD ports have both the new and old versions of mod_python and SQLite, but earlier versions of pysqlite and mod_python won't integrate:
     323 * pysqlite requires threaded support in Python
     324 * mod_python requires a threadless install.
     325
     326Apache2 does not automatically support threads on FreeBSD. You could force thread support when running `./configure` for Apache, using `--enable-threads`, but this isn´t recommended.
    320327The best option [http://modpython.org/pipermail/mod_python/2006-September/021983.html seems to be] adding to /usr/local/apache2/bin/ennvars the line:
    321328
    322 {{{
     329{{{#!sh
    323330export LD_PRELOAD=/usr/lib/libc_r.so
    324331}}}
     
    326333==== Fedora 7 Issues
    327334
    328 Make sure you install the 'python-sqlite2' package as it seems to be required for TracModPython but not for tracd.
     335Make sure you install the 'python-sqlite2' package as it seems to be required for TracModPython, but not for tracd.
    329336
    330337=== Subversion issues
    331338
    332 If you get the following Trac error `Unsupported version control system "svn"` only under mod_python, though it works well on the command-line and even with TracStandalone, chances are that you forgot to add the path to the Python bindings with the [TracModPython#ConfiguringPythonPath PythonPath] directive. The better way is to add a link to the bindings in the Python `site-packages` directory, or create a `.pth` file in that directory.
    333 
    334 If this is not the case, it's possible that you're using Subversion libraries that are binary incompatible with the Apache ones and an incompatibility of the `apr` libraries is usually the cause. In that case, you also won't be able to use the svn modules for Apache (`mod_dav_svn`).
     339If you get the following Trac error `Unsupported version control system "svn"` only under mod_python, though it works well on the command-line and even with TracStandalone, chances are that you forgot to add the path to the Python bindings with the [TracModPython#ConfiguringPythonPath PythonPath] directive. A better way is to add a link to the bindings in the Python `site-packages` directory, or create a `.pth` file in that directory.
     340
     341If this is not the case, it's possible that you are using Subversion libraries that are binary incompatible with the Apache ones and an incompatibility of the `apr` libraries is usually the cause. In that case, you also won't be able to use the svn modules for Apache (`mod_dav_svn`).
    335342
    336343You also need a recent version of `mod_python` in order to avoid a runtime error ({{{argument number 2: a 'apr_pool_t *' is expected}}}) due to the default usage of multiple sub-interpreters. Version 3.2.8 ''should'' work, though it's probably better to use the workaround described in [trac:#3371 #3371], in order to force the use of the main interpreter:
    337 {{{
     344{{{#!apache
    338345PythonInterpreter main_interpreter
    339346}}}
    340347
    341 This is anyway the recommended workaround for other well-known issues seen when using the Python bindings for Subversion within mod_python ([trac:#2611 #2611], [trac:#3455 #3455]). See in particular Graham Dumpleton's comment in [trac:comment:9:ticket:3455 #3455] explaining the issue.
     348This is also the recommended workaround for other issues seen when using the Python bindings for Subversion within mod_python ([trac:#2611 #2611], [trac:#3455 #3455]). See in particular Graham Dumpleton's comment in [trac:comment:9:ticket:3455 #3455] explaining the issue.
    342349
    343350=== Page layout issues
    344351
    345 If the formatting of the Trac pages look weird, chances are that the style sheets governing the page layout are not handled properly by the web server. Try adding the following lines to your apache configuration:
    346 {{{
    347 #!xml
     352If the formatting of the Trac pages look weird, chances are that the style sheets governing the page layout are not handled properly by the web server. Try adding the following lines to your Apache configuration:
     353{{{#!apache
    348354Alias /myproject/css "/usr/share/trac/htdocs/css"
    349355<Location /myproject/css>
     
    352358}}}
    353359
    354 Note: For the above configuration to have any effect it must be put after the configuration of your project root location, i.e. {{{<Location /myproject />}}}.
    355 
    356 Also, setting `PythonOptimize On` seems to mess up the page headers and footers, in addition to hiding the documentation for macros and plugins (see #Trac8956). Considering how little effect the option has, leave it `Off`.
     360'''Note''': For the above configuration to have any effect it must be put after the configuration of your project root location, ie {{{<Location /myproject />}}}.
     361
     362**Note:** Do not enable python optimizations using the directive `PythonOptimize On`. When optimizations are enabled the page header/footer and documentation for macros and plugins will be hidden. An error will be raised in Trac 1.0.11 and later when optimizations are enabled.
    357363
    358364=== HTTPS issues
    359365
    360 If you want to run Trac fully under https you might find that it tries to redirect to plain http. In this case just add the following line to your apache configuration:
    361 {{{
    362 #!xml
    363 <VirtualHost * >
     366If you want to run Trac fully under https you might find that it tries to redirect to plain http. In this case just add the following line to your Apache configuration:
     367{{{#!apache
     368<VirtualHost *>
    364369    DocumentRoot /var/www/myproject
    365370    ServerName trac.mycompany.com
     
    373378You may encounter segfaults (reported on Debian etch) if php5-mhash module is installed. Try to remove it to see if this solves the problem. See [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=411487 Debian bug report].
    374379
    375 Some people also have troubles when using php5 compiled with its own 3rd party libraries instead of system libraries. Check [http://www.djangoproject.com/documentation/modpython/#if-you-get-a-segmentation-fault Django segmentation fault].
     380Some people also have troubles when using PHP5 compiled with its own third party libraries instead of system libraries. Check [http://www.djangoproject.com/documentation/modpython/#if-you-get-a-segmentation-fault Django segmentation fault].
    376381
    377382----