Differences between revisions 3 and 17 (spanning 14 versions)
Revision 3 as of 2012-03-09 02:12:10
Size: 3842
Editor: AaronJensen
Comment: Removing HgWeb wiki words.
Revision 17 as of 2012-10-16 10:56:20
Size: 8656
Editor: 195
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
## page was renamed from HgWebInIISOnWindows
## page was renamed from HgWebOnWindows
Line 3: Line 5:
= Installing HgWeb on Windows = = Configuring HgWeb in IIS on Windows =
Line 5: Line 7:
== Creating the Hg``Web Website ==

This page describes how to get Hg``Web running on Windows Vista/2008 and 7/2008 R2.
This page describes how to get Hg``Web running on
 *
Windows Vista
 * Windows Server
2008
 * Widows 7
 * Wi
ndows Server 2008 R2
Line 10: Line 14:

== Creating the HgWeb Website ==
Line 31: Line 38:
C:\Windows\system32\inetsrv\appcmd set config /section:isapiCgiRestriction /+"[path='C:\Python26\python.exe -u %22%s%22',description='Python',allowed='True']" > C:\Windows\system32\inetsrv\appcmd set config /section:isapiCgiRestriction /+"[path='C:\Python26\python.exe -u %22%s%22',description='Python',allowed='True']"
Line 45: Line 52:
== Adding Mercurial to Python ==
Line 47: Line 56:
[[Download#Windows|Download]] and run the Mercurial '''''Python module installer''''' (it's the one whose description says "use this for running hgweb"). After installation, you should see {{{mercurial}}} and {{{hgext}}} directories in your {{{PYTHON_HOME\Lib\site-packages}}} directory. If you don't see those directories, you chose the wrong installer. [[Download#Windows|Download]] and run the Mercurial '''Python module installer''' (it's the one whose description says "use this for running hgweb"). After installation, you should see {{{mercurial}}} and {{{hgext}}} directories in your {{{PYTHON_HOME\Lib\site-packages}}} directory. If you don't see those directories, you chose the wrong installer.
Line 54: Line 63:
config = "HGWEB_ROOT\hgweb.config config = "HGWEB_ROOT\hgweb.config"
Line 84: Line 93:

== Authenticating Against Active Directory ==

Add the following to your Hg``Web's web.config, in the {{{/configuration/system.webServer/security/authentication}}} section:

{{{#!xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <authentication>
        <basicAuthentication enabled="true" realm="YOUR_DOMAIN" defaultLogonDomain="YOUR_DOMAIN" />
        <anonymousAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>
}}}

Replace {{{YOUR_DOMAIN}}} with the name of your Windows domain. Anonymous authentication is enabled so you can support unrestricted repositories (e.g. {{{allow_push=*}}}).

You'll need to unlock the basic authentication configuration section so it can be configured in your web.config:

{{{#!bat
> C:\Windows\system32\inetsrv\appcmd unlock config /section:basicAuthentication
}}}

You can test that authentication is working by adding an {{{allow_push}}} setting to the repository's .hg\hgrc file '''on the server''':

{{{#!ini
allow_push = USERNAME
}}}

Commit a change an attempt a push. You should see a sequence like this:

{{{#!bash
> hg push
pushing to https://localhost:4301/cm
searching for changes
http authorization required
realm: YOUR_DOMAIN
user: USERNAME
password:
}}}

'''Warning''' Remember that basic authentication sends usernames and passwords over the network in the clear. Anyone on the network will be able to read the user's credentials. We strongly recommend securing connections with SSL. Generating an SSL certificate and assigning it to your Hg``Web website is beyond the scope of this article.

== File System Permissions ==

IIS starts CGI processes as the user being authenticated. For un-authenticated, anonymous users/requests, the CGI process is started as the website's application pool identity. For authenticated users/requests, the CGI process is started as the authenticated user. Make sure you set proper NTFS permissions on your server-side repositories. Anybody who needs read-only access should have '''Read & execute''', '''List folder contents''', and '''Read ''' permissions. Anybody who needs read/write access should have '''Modify''', '''Read & execute''', '''List folder contents''', '''Read''', and '''Write''' NTFS permissions. We recommend creating groups for each set of users for each repository, and grant the appropriate NTFS permissions to those groups. To grant someone permission, add them to the appropriate group.

== Running via ISAPI ==

While running ''hgweb.cgi'' is fairly easy, CGI is rather slow way of serving pages. If more speed is required you should consider using ISAPI. Basic steps are described in
[[http://selenic.com/repo/hg/file/5983de86462c/contrib/win32/hgwebdir_wsgi.py|contrib/win32/hgwebdir_wsgi.py]] in Mercurial repository and in [[http://www.eworldui.net/blog/post/2010/04/08/Setting-up-Mercurial-server-in-IIS7-using-a-ISAPI-module.aspx|blog post]] (
[[http://web.archive.org/web/20101027212430/http://eworldui.net/blog/post/2010/04/08/Setting-up-Mercurial-server-in-IIS7-using-a-ISAPI-module.aspx|wayback archive]]).

Please note that some combinations of Windows/IIS/Python/Mercurial will not work. For example Windows Server 2008 R2 64 bit with Python 2.6 32 bit and precompiled 32 bit Mercurial
are not working and result in '''Error 500''' and such message:

{{{
Failed to import callback module 'hgwebdir_wsgi'
The specified module could not be found.
}}}

This is probably because of mix of [[https://groups.google.com/forum/?fromgroups#!msg/isapi_wsgi-dev/A_orSF7CKB0/eGK4yCydy8IJ|involved CRTs]].

<<Anchor(SeeAlso)>>

== See also ==
 * PublishingRepositories for general info on repository publishing
 * [[http://vampirebasic.blogspot.com/2009/06/running-mercurial-on-windows.html|Vampire Basic Blog]] has a very good walkthrough on how to set up hgwebdir on IIS
 * [[http://www.jeremyskinner.co.uk/mercurial-on-iis7/|Setting up a Mercurial server under IIS7 on Windows Server 2008 R2]] covers IIS and includes pictures to illustrate the process
 * [[http://www.endswithsaurus.com/2010/05/setting-up-and-configuring-mercurial-in.html|Setting up and configuring Mercurial in a Windows/IIS/Active Directory environment]] is a series of 4 blog posts describing how to set up Mercurial publishing over IIS and Windows
 * [[http://hglabhq.com/|HgLab]] - Managed Mercurial Server for Windows with push and pull support, ACLs and repository browser and manager.

----
CategoryWeb CategoryHowTo CategoryTipsAndTricks

Configuring HgWeb in IIS on Windows

This page describes how to get HgWeb running on

  • Windows Vista
  • Windows Server 2008
  • Widows 7
  • Windows Server 2008 R2

1. Creating the HgWeb Website

Install Python 2.6. By default, this installs to C:\Python26. On this page, the Python installation folder is referred to as PYTHON_HOME.

Create an HgWeb website in IIS. We'll call the path to this website's root directory HGWEB_ROOT.

Create a web.config file in HGWEB_ROOT. Edit it to look like this:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="PYTHON_HOME\python.exe -u &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
  </system.webServer>
</configuration>

You'll then need to enable the Python module. From a command prompt, run:

> C:\Windows\system32\inetsrv\appcmd set config /section:isapiCgiRestriction /+"[path='C:\Python26\python.exe -u %22%s%22',description='Python',allowed='True']"

You should have everything configured to start running CGI scripts through Python. To test that it's working, create a test.cgi file in HGWEB_ROOT:

   1 print 'Status: 200 OK'
   2 print 'Content-Type: text/html'
   3 print
   4 print '<html><body><h1>It Works!</h1></body></html>'

Save the file. Hit the test.cgi file in your web browser. If you see It Works!, you've got the Python CGI handler installed correctly.

2. Adding Mercurial to Python

Create an empty file named hgweb.config in your HgWeb root directory. This is where the HgWeb configuration goes once everything is working.

Download and run the Mercurial Python module installer (it's the one whose description says "use this for running hgweb"). After installation, you should see mercurial and hgext directories in your PYTHON_HOME\Lib\site-packages directory. If you don't see those directories, you chose the wrong installer.

Download the hgweb.cgi script for your version of Mercurial. Browse the Mercurial source code. Click the the tag for your version, click Browse in the navigation menu, click the hgweb.cgi script, then right-click Raw from the navigation menu, choose Save As... and save the file into your HgWeb directory.

Open hgweb.cgi and change the value of the config variable to point to the hgweb.config file you created earlier:

   1 config = "HGWEB_ROOT\hgweb.config"

Hit the hgweb.cgi script in your web browse and you should see the HgWeb interface.

3. Configuring URL Rewrite Rules

Now, we need to create some URL rewrite rules so that URLs to your repositories don't have hgweb.cgi in them.

First, you'll need to download and install version 2 of the Url Rewrite Module.

Once that is finished, edit the HGWEB_ROOT\web.config file and add the following <rewrite> section under <system.webServer>:

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="rewrite to hgwebdir" patternSyntax="Wildcard">
          <match url="*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          </conditions>
          <action type="Rewrite" url="hgweb.cgi/{R:1}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

You should now be able to hit your website without hgweb.cgi in the URL and see the HgWeb UI.

4. Authenticating Against Active Directory

Add the following to your HgWeb's web.config, in the /configuration/system.webServer/security/authentication section:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <authentication>
        <basicAuthentication enabled="true" realm="YOUR_DOMAIN" defaultLogonDomain="YOUR_DOMAIN" />
        <anonymousAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>

Replace YOUR_DOMAIN with the name of your Windows domain. Anonymous authentication is enabled so you can support unrestricted repositories (e.g. allow_push=*).

You'll need to unlock the basic authentication configuration section so it can be configured in your web.config:

> C:\Windows\system32\inetsrv\appcmd unlock config /section:basicAuthentication

You can test that authentication is working by adding an allow_push setting to the repository's .hg\hgrc file on the server:

allow_push = USERNAME

Commit a change an attempt a push. You should see a sequence like this:

> hg push
pushing to https://localhost:4301/cm
searching for changes
http authorization required
realm: YOUR_DOMAIN
user: USERNAME
password:

Warning Remember that basic authentication sends usernames and passwords over the network in the clear. Anyone on the network will be able to read the user's credentials. We strongly recommend securing connections with SSL. Generating an SSL certificate and assigning it to your HgWeb website is beyond the scope of this article.

5. File System Permissions

IIS starts CGI processes as the user being authenticated. For un-authenticated, anonymous users/requests, the CGI process is started as the website's application pool identity. For authenticated users/requests, the CGI process is started as the authenticated user. Make sure you set proper NTFS permissions on your server-side repositories. Anybody who needs read-only access should have Read & execute, List folder contents, and Read permissions. Anybody who needs read/write access should have Modify, Read & execute, List folder contents, Read, and Write NTFS permissions. We recommend creating groups for each set of users for each repository, and grant the appropriate NTFS permissions to those groups. To grant someone permission, add them to the appropriate group.

6. Running via ISAPI

While running hgweb.cgi is fairly easy, CGI is rather slow way of serving pages. If more speed is required you should consider using ISAPI. Basic steps are described in contrib/win32/hgwebdir_wsgi.py in Mercurial repository and in blog post ( wayback archive).

Please note that some combinations of Windows/IIS/Python/Mercurial will not work. For example Windows Server 2008 R2 64 bit with Python 2.6 32 bit and precompiled 32 bit Mercurial are not working and result in Error 500 and such message:

Failed to import callback module 'hgwebdir_wsgi'
The specified module could not be found.

This is probably because of mix of involved CRTs.

7. See also


CategoryWeb CategoryHowTo CategoryTipsAndTricks

HgWebInIisOnWindows (last edited 2018-04-16 13:04:02 by PeterSuter)