Changes between Initial Version and Version 1 of TracModPython

Show
Ignore:
Timestamp:
04/10/2008 12:49:09 PM (2 years ago)
Author:
trac (IP: 127.0.0.1)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TracModPython

    v1 v1  
      1 = Trac and mod_python = 
      2 [[TracGuideToc]] 
      3  
      4 Trac 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. 
      5  
      6 These instructions are for Apache 2; if you are still using Apache 1.3, you may have some luck with [wiki:TracModPython2.7 TracModPython2.7]. 
      7  
      8 == Simple configuration == 
      9  
      10 If you just installed mod_python, you may have to add a line to load the module in the Apache configuration: 
      11 {{{ 
      12 LoadModule python_module modules/mod_python.so 
      13 }}} 
      14  
      15  ''Note: The exact path to the module depends on how the HTTPD installation is laid out.'' 
      16 On Debian using apt-get 
      17 {{{ 
      18 apt-get install libapache2-mod-python libapache2-mod-python-doc 
      19 }}} 
      20 (Still on Debian) after you have installed mod_python, you must enable the modules in apache2 (equivalent of the above Load Module directive): 
      21 {{{ 
      22 a2enmod mod_python 
      23 }}} 
      24 On Fedora use, using yum: 
      25 {{{ 
      26 yum install mod_python 
      27 }}} 
      28 You 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+. 
      29 {{{ 
      30 #!xml 
      31 <Location /mpinfo> 
      32    SetHandler mod_python 
      33    PythonInterpreter main_interpreter 
      34    PythonHandler mod_python.testhandler 
      35 </Location> 
      36 }}} 
      37  
      38 A simple setup of Trac on mod_python looks like this: 
      39 {{{ 
      40 #!xml 
      41 <Location /projects/myproject> 
      42    SetHandler mod_python 
      43    PythonInterpreter main_interpreter 
      44    PythonHandler trac.web.modpython_frontend  
      45    PythonOption TracEnv /var/trac/myproject 
      46    PythonOption TracUriRoot /projects/myproject 
      47 </Location> 
      48 }}} 
      49  
      50 The option '''`TracUriRoot`''' may or may not be necessary in your setup. Try your configuration without it; if the URLs produced by Trac look wrong, if Trac does not seem to recognize URLs correctly, or you get an odd "No handler matched request to..." error, add the '''`TracUriRoot`''' option.  You will notice that the `Location` and '''`TracUriRoot`''' have the same path. 
      51  
      52 === Configuring Authentication === 
      53  
      54 Creating password files and configuring authentication works similar to the process for [wiki:TracCgi#AddingAuthentication CGI]: 
      55 {{{ 
      56 #!xml 
      57 <Location /projects/myproject/login> 
      58   AuthType Basic 
      59   AuthName "myproject" 
      60   AuthUserFile /var/trac/myproject/.htpasswd 
      61   Require valid-user 
      62 </Location> 
      63 }}} 
      64  
      65 Configuration for mod_ldap authentication in Apache is a bit tricky (httpd 2.2.x and OpenLDAP: slapd 2.3.19) 
      66  
      67 1. You need to load the following modules in Apache httpd.conf 
      68 {{{ 
      69 LoadModule ldap_module modules/mod_ldap.so 
      70 LoadModule authnz_ldap_module modules/mod_authnz_ldap.so 
      71 }}} 
      72  
      73 2. Your httpd.conf also needs to look something like: 
      74  
      75 {{{ 
      76 #!xml 
      77 <Location /trac/> 
      78   SetHandler mod_python 
      79   PythonInterpreter main_interpreter 
      80   PythonHandler trac.web.modpython_frontend 
      81   PythonOption TracEnv /home/trac/ 
      82   PythonOption TracUriRoot /trac/ 
      83   Order deny,allow 
      84   Deny from all 
      85   Allow from 192.168.11.0/24 
      86   AuthType Basic 
      87   AuthName "Trac" 
      88   AuthBasicProvider "ldap" 
      89   AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=co,dc=ke?uid?sub?(objectClass=inetOrgPerson)" 
      90   authzldapauthoritative Off 
      91   require valid-user 
      92 </Location> 
      93 }}} 
      94  
      95 Or the LDAP interface to a Microsoft Active Directory: 
      96  
      97 {{{ 
      98 #!xml 
      99 <Location /trac/> 
      100   SetHandler mod_python 
      101   PythonInterpreter main_interpreter 
      102   PythonHandler trac.web.modpython_frontend 
      103   PythonOption TracEnv /home/trac/ 
      104   PythonOption TracUriRoot /trac/ 
      105   Order deny,allow 
      106   Deny from all 
      107   Allow from 192.168.11.0/24 
      108   AuthType Basic 
      109   AuthName "Trac" 
      110   AuthBasicProvider "ldap" 
      111   AuthLDAPURL "ldap://adserver.company.com:3268/DC=company,DC=com?sAMAccountName?sub?(objectClass=user)" 
      112   AuthLDAPBindDN       ldap-auth-user@company.com 
      113   AuthLDAPBindPassword "the_password" 
      114   authzldapauthoritative Off 
      115   # require valid-user 
      116   require ldap-group CN=Trac Users,CN=Users,DC=company,DC=com 
      117 </Location> 
      118 }}} 
      119  
      120 Note 1: This is the case where the LDAP search will get around the multiple OUs, conecting to Global Catalog Server portion of AD (Notice the port is 3268, not the normal LDAP 389). The GCS is basically a "flattened" tree which allows searching for a user without knowing to which OU they belong. 
      121  
      122 Note 2: Active Directory requires an authenticating user/password to access records (AuthLDAPBindDN and AuthLDAPBindPassword). 
      123  
      124 Note 3: The directive "require ldap-group ..."  specifies an AD group whose members are allowed access. 
      125  
      126  
      127  
      128 === Setting the !PythonPath === 
      129  
      130 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: 
      131 {{{ 
      132 #!xml 
      133 <Location /projects/myproject> 
      134   ... 
      135   PythonPath "sys.path + ['/path/to/trac']" 
      136   ... 
      137 </Location> 
      138 }}} 
      139  
      140 Be careful about using the !PythonPath directive, and ''not'' `SetEnv PYTHONPATH`, as the latter won't work. 
      141  
      142 == Setting up multiple projects == 
      143  
      144 The Trac mod_python handler supports a configuration option similar to Subversion's `SvnParentPath`, called `TracEnvParentDir`: 
      145 {{{ 
      146 #!xml 
      147 <Location /projects> 
      148   SetHandler mod_python 
      149   PythonInterpreter main_interpreter 
      150   PythonHandler trac.web.modpython_frontend  
      151   PythonOption TracEnvParentDir /var/trac 
      152   PythonOption TracUriRoot /projects 
      153 </Location> 
      154 }}} 
      155  
      156 When 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. 
      157  
      158 If you don't want to have the subdirectory listing as your projects home page you can use a 
      159 {{{ 
      160 #!xml 
      161 <LocationMatch "/.+/"> 
      162 }}} 
      163  
      164 This will instruct Apache to use mod_python for all locations different from root while having the possibility of placing a custom home page for root in your !DocumentRoot folder. 
      165  
      166 You can also use the same authentication realm for all of the projects using a `<LocationMatch>` directive: 
      167 {{{ 
      168 #!xml 
      169 <LocationMatch "/projects/[^/]+/login"> 
      170   AuthType Basic 
      171   AuthName "Trac" 
      172   AuthUserFile /var/trac/.htpasswd 
      173   Require valid-user 
      174 </LocationMatch> 
      175 }}} 
      176  
      177 == Virtual Host Configuration == 
      178  
      179 Below is the sample configuration required to set up your trac as a virtual server (i.e. when you access it at the URLs like 
      180 !http://trac.mycompany.com): 
      181  
      182 {{{ 
      183 #!xml 
      184 <VirtualHost * > 
      185     DocumentRoot /var/www/myproject 
      186     ServerName trac.mycompany.com 
      187     <Location /> 
      188         SetHandler mod_python 
      189         PythonInterpreter main_interpreter 
      190         PythonHandler trac.web.modpython_frontend 
      191         PythonOption TracEnv /var/trac/myproject 
      192         PythonOption TracUriRoot / 
      193     </Location> 
      194     <Location /login> 
      195         AuthType Basic 
      196         AuthName "MyCompany Trac Server" 
      197         AuthUserFile /var/trac/myproject/.htpasswd 
      198         Require valid-user 
      199     </Location> 
      200 </VirtualHost> 
      201 }}} 
      202  
      203 if you have issues with login try using `<LocationMatch>` instead of `<Location>` 
      204  
      205 For a virtual host that supports multiple projects replace "`TracEnv`" /var/trac/myproject with "`TracEnvParentDir`" /var/trac/ 
      206  
      207 == Troubleshooting == 
      208  
      209 In general, if you get server error pages, you can either check the Apache error log, or enable the `PythonDebug` option: 
      210 {{{ 
      211 #!xml 
      212 <Location /projects/myproject> 
      213   ... 
      214   PythonDebug on 
      215 </Location> 
      216 }}} 
      217  
      218 For multiple projects, try restarting the server as well. 
      219  
      220 === Expat-related segmentation faults === #expat 
      221  
      222 This problem will most certainly hit you on Unix when using python 2.4. 
      223 In Python 2.4, some version of Expat (an XML parser library written in C) is used,  
      224 and if Apache is using another version, this results in segmentation faults. 
      225 As Trac 0.11 is using Genshi, which will use indirectly use Expat, that problem 
      226 can now hit you even if everything was working fine before with Trac 0.10. 
      227  
      228 See Graham Dumpleton's detailed [http://www.dscpl.com.au/wiki/ModPython/Articles/ExpatCausingApacheCrash explanation and workarounds] for the issue. 
      229  
      230 === Form submission problems === 
      231  
      232 If you're experiencing problems submitting some of the forms in Trac (a common problem is that you get redirected to the start page after submission), check whether your {{{DocumentRoot}}} contains a folder or file with the same path that you mapped the mod_python handler to. For some reason, mod_python gets confused when it is mapped to a location that also matches a static resource. 
      233  
      234 === Problem with virtual host configuration === 
      235  
      236 If the <Location /> directive is used, setting the `DocumentRoot` may result in a ''403 (Forbidden)'' error. Either remove the `DocumentRoot` directive, or make sure that accessing the directory it points is allowed (in a corresponding `<Directory>` block). 
      237  
      238 Using <Location /> together with `SetHandler` resulted in having everything handled by mod_python, which leads to not being able download any CSS or images/icons. I used <Location /trac> `SetHandler None` </Location> to circumvent the problem, though I do not know if this is the most elegant solution. 
      239  
      240 === Using .htaccess === 
      241  
      242 Although it may seem trivial to rewrite the above configuration as a directory in your document root with a `.htaccess` file, this does not work. Apache will append a "/" to any Trac URLs, which interferes with its correct operation. 
      243  
      244 It may be possible to work around this with mod_rewrite, but I failed to get this working. In all, it is more hassle than it is worth. Stick to the provided instructions. :) 
      245  
      246 === Win32 Issues === 
      247 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. 
      248  
      249  
      250 === OS X issues === 
      251  
      252 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, but there's also a patch available for earlier versions [http://www.dscpl.com.au/projects/vampire/patches.html here]. 
      253  
      254 === SELinux issues === 
      255  
      256 If Trac reports something like: ''Cannot get shared lock on db.lock'' 
      257 The security context on the repository may need to be set: 
      258  
      259 {{{ 
      260 chcon -R -h -t httpd_sys_content_t PATH_TO_REPOSITORY 
      261 }}} 
      262  
      263 See also [[http://subversion.tigris.org/faq.html#reposperms]] 
      264  
      265 === FreeBSD issues === 
      266 Pay attention to the version of the installed mod_python and sqlite packages. Ports have both the new and old ones, 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. 
      267  
      268 If you compiled and installed apache2, apache wouldn´t support threads (cause it doesn´t work very well on FreeBSD). You could force thread support when running ./configure for apache, using --enable-threads, but this isn´t recomendable. 
      269 The best option [[http://modpython.org/pipermail/mod_python/2006-September/021983.html seems to be]] adding to /usr/local/apache2/bin/ennvars the line  
      270  
      271 {{{ 
      272 export LD_PRELOAD=/usr/lib/libc_r.so 
      273 }}} 
      274  
      275 === Subversion issues === 
      276  
      277 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.) 
      278  
      279 If this is not the case, it's possible that you're using Subversion libraries that are binary incompatible with the apache ones (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`). 
      280  
      281 You 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. 3.2.8 ''should'' work, though it's probably better to use the workaround described in #3371, in order to force the use of the main interpreter: 
      282 {{{ 
      283 PythonInterpreter main_interpreter 
      284 }}} 
      285 This is anyway the recommended workaround for other well-known issues seen when using the Python bindings for Subversion within mod_python (#2611, #3455). See in particular Graham Dumpleton's comment in [comment:ticket:3455:9 #3455] explaining the issue. 
      286  
      287 === Page layout issues === 
      288  
      289 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: 
      290 {{{ 
      291 #!xml 
      292 Alias /myproject/css "/usr/share/trac/htdocs/css" 
      293 <Location /myproject/css> 
      294     SetHandler None 
      295 </Location> 
      296 }}} 
      297  
      298 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 />}}}. 
      299  
      300 === HTTPS issues === 
      301  
      302 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: 
      303 {{{ 
      304 #!xml 
      305 <VirtualHost * > 
      306     DocumentRoot /var/www/myproject 
      307     ServerName trac.mycompany.com 
      308     SetEnv HTTPS 1 
      309     .... 
      310 </VirtualHost> 
      311 }}} 
      312  
      313 === Fedora 7 Issues === 
      314 Make sure you install the 'python-sqlite2' package as it seems to be required for TracModPython but not for tracd 
      315  
      316  
      317 === Segmentation fault with php5-mhash or other php5 modules === 
      318 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 debian bug report [[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=411487]] 
      319  
      320 Some people also have troubles when using php5 compiled with its own 3rd party libraries instead of system libraries. Check here [[http://www.djangoproject.com/documentation/modpython/#if-you-get-a-segmentation-fault]] 
      321  
      322 ---- 
      323 See also TracGuide, TracInstall, TracCgi, TracFastCgi