Changes between Version 3 and Version 4 of TracModPython


Ignore:
Timestamp:
Apr 21, 2021 12:46:18 PM (3 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracModPython

    v3 v4  
     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
     
    137148When you request the `/projects` URL, you will get a listing of all subdirectories of the directory you set as `TracEnvParentDir` that look like Trac environment directories. Selecting any project in the list will bring you to the corresponding Trac environment.
    138149
     150Directories residing in `TracEnvParentDir` that are not environment directories will display an error message on the [TracInterfaceCustomization#ProjectList project index page]. The directories can be excluded by listing them in a `.tracignore` file residing in `TracEnvParentDir`. Unix [https://docs.python.org/2/library/fnmatch.html shell-style wildcard patterns] can be used in the newline separated list of directories.
     151
    139152If you don't want to have the subdirectory listing as your projects home page you can use a
    140 {{{
    141 #!xml
     153{{{#!apache
    142154<LocationMatch "/.+/">
    143155}}}
     
    146158
    147159You can also use the same authentication realm for all of the projects using a `<LocationMatch>` directive:
    148 {{{
    149 #!xml
     160{{{#!apache
    150161<LocationMatch "/projects/[^/]+/login">
    151162  AuthType Basic
     
    158169=== Virtual Host Configuration
    159170
    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 * >
     171Below is the sample configuration required to set up your Trac as a virtual server, ie when you access it at the URLs like
     172`http://trac.mycompany.com`:
     173
     174{{{#!apache
     175<VirtualHost *>
    166176    DocumentRoot /var/www/myproject
    167177    ServerName trac.mycompany.com
     
    183193
    184194This 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.
     195 * Try using `<LocationMatch>` instead of `<Location>`.
     196 * `<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.
    187197 * Depending on apache's `NameVirtualHost` configuration, you may need to use `<VirtualHost *:80>` instead of `<VirtualHost *>`.
    188198
    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".
     199For a virtual host that supports multiple projects replace `TracEnv /var/trac/myproject` with `TracEnvParentDir /var/trac`.
     200
     201'''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".
    192202
    193203== Troubleshooting
    194204
    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
     205If you get server error pages, you can either check the Apache error log, or enable the `PythonDebug` option:
     206{{{#!apache
    198207<Location /projects/myproject>
    199208  ...
     
    208217If you've used `<Location />` directive, it will override any other directives, as well as `<Location /login>`.
    209218The workaround is to use negation expression as follows (for multi project setups):
    210 {{{
    211 #!xml
     219{{{#!apache
    212220#this one for other pages
    213221<Location ~ "/*(?!login)">
     
    216224   PythonOption TracEnvParentDir /projects
    217225   PythonOption TracUriRoot /
    218 
    219 </Location>
     226</Location>
     227
    220228#this one for login page
    221229<Location ~ "/[^/]+/login">
     
    255263=== Problem with zipped egg
    256264
    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 {{{
     265It'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:
     266
     267{{{#!sh
    260268easy_install --always-unzip Trac-0.12b1.zip
    261269}}}
     
    268276
    269277This also works out-of-box, with following trivial config:
    270 {{{#!xml
     278{{{#!apache
    271279SetHandler mod_python
    272280PythonInterpreter main_interpreter
     
    281289}}}
    282290
    283 The `TracUriRoot` is obviously the path you need to enter to the browser to get to Trac, eg domain.tld/projects/trac.
     291The `TracUriRoot` is obviously the path you need to enter to the browser to get to Trac, eg `domain.tld/projects/trac`.
    284292
    285293=== Additional .htaccess help
    286294
    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 {{{
     295If 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:
     296
     297{{{#!apache
    290298<IfModule mod_rewrite.c>
    291299  RewriteEngine Off
     
    296304==== Win32 Issues
    297305
    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.
     306If 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.
    299307
    300308==== OS X issues
    301309
    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.
     310When 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.
    303311
    304312==== SELinux issues
    305313
    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 {{{
     314If Trac reports something like: `Cannot get shared lock on db.lock`, then the security context on the repository may need to be set:
     315
     316{{{#!sh
    310317chcon -R -h -t httpd_sys_content_t PATH_TO_REPOSITORY
    311318}}}
    312319
    313 See also [http://subversion.apache.org/faq.html#reposperms How do I set repository permissions correctly?]
     320See also [https://subversion.apache.org/faq.html#reposperms How do I set repository permissions correctly?]
    314321
    315322==== FreeBSD issues
    316323
    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.
     324The 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:
     325 * pysqlite requires threaded support in Python
     326 * mod_python requires a threadless install.
     327
     328Apache2 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.
    320329The best option [http://modpython.org/pipermail/mod_python/2006-September/021983.html seems to be] adding to /usr/local/apache2/bin/ennvars the line:
    321330
    322 {{{
     331{{{#!sh
    323332export LD_PRELOAD=/usr/lib/libc_r.so
    324333}}}
     
    326335==== Fedora 7 Issues
    327336
    328 Make sure you install the 'python-sqlite2' package as it seems to be required for TracModPython but not for tracd.
     337Make sure you install the 'python-sqlite2' package as it seems to be required for TracModPython, but not for tracd.
    329338
    330339=== Subversion issues
    331340
    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`).
     341If 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.
     342
     343If 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`).
    335344
    336345You 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 {{{
     346{{{#!apache
    338347PythonInterpreter main_interpreter
    339348}}}
    340349
    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.
     350This 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.
    342351
    343352=== Page layout issues
    344353
    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
     354If 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:
     355{{{#!apache
    348356Alias /myproject/css "/usr/share/trac/htdocs/css"
    349357<Location /myproject/css>
     
    352360}}}
    353361
    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`.
     362'''Note''': For the above configuration to have any effect it must be put after the configuration of your project root location, ie {{{<Location /myproject />}}}.
     363
     364**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.
    357365
    358366=== HTTPS issues
    359367
    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 * >
     368If 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:
     369{{{#!apache
     370<VirtualHost *>
    364371    DocumentRoot /var/www/myproject
    365372    ServerName trac.mycompany.com
     
    371378=== Segmentation fault with php5-mhash or other php5 modules
    372379
    373 You 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].
    374 
    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].
     380You 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 [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=411487 Debian bug report].
     381
     382Some people also have troubles when using PHP5 compiled with its own third party libraries instead of system libraries. Check [https://www.djangoproject.com/documentation/modpython/#if-you-get-a-segmentation-fault Django segmentation fault].
    376383
    377384----