|  | = Gerrit Code Review - Reverse Proxy | 
|  |  | 
|  | == Description | 
|  |  | 
|  | Gerrit can be configured to run behind a third-party web server. | 
|  | This allows the other web server to bind to the privileged port 80 | 
|  | (or 443 for SSL), as well as offloads the SSL processing overhead | 
|  | from Java to optimized native C code. | 
|  |  | 
|  |  | 
|  | == Gerrit Configuration | 
|  |  | 
|  | Ensure `'$site_path'/etc/gerrit.config` has the property | 
|  | link:config-gerrit.html#httpd.listenUrl[httpd.listenUrl] configured | 
|  | to use 'proxy-http://' or 'proxy-https://' and a free port number. | 
|  | This may have already been configured if proxy support was enabled | 
|  | during 'init'. | 
|  |  | 
|  | ---- | 
|  | [httpd] | 
|  | listenUrl = proxy-http://127.0.0.1:8081/r/ | 
|  | ---- | 
|  |  | 
|  | == Reverse proxy and client IPs | 
|  |  | 
|  | When behind a reverse proxy the http_log will log the IP of the reverse proxy | 
|  | as client.ip. To log the correct client IP you must provide the | 
|  | 'X-Forwarded-For' header from the reverse proxy. | 
|  | See the nginx configuration example below. | 
|  |  | 
|  |  | 
|  | == Apache 2 Configuration | 
|  |  | 
|  | To run Gerrit behind an Apache server using 'mod_proxy', enable the | 
|  | necessary Apache2 modules: | 
|  |  | 
|  | ---- | 
|  | a2enmod proxy_http | 
|  | a2enmod ssl          ; # optional, needed for HTTPS / SSL | 
|  | ---- | 
|  |  | 
|  | Configure an Apache VirtualHost to proxy to the Gerrit daemon, | 
|  | setting the 'ProxyPass' line to use the 'http://' URL configured | 
|  | above.  Ensure the path of ProxyPass and httpd.listenUrl match, | 
|  | or links will redirect to incorrect locations. | 
|  |  | 
|  | ---- | 
|  | <VirtualHost *> | 
|  | ServerName review.example.com | 
|  |  | 
|  | ProxyRequests Off | 
|  | ProxyVia Off | 
|  | ProxyPreserveHost On | 
|  |  | 
|  | <Proxy *> | 
|  | Order deny,allow | 
|  | Allow from all | 
|  | # Use following line instead of the previous two on Apache >= 2.4 | 
|  | # Require all granted | 
|  | </Proxy> | 
|  |  | 
|  | AllowEncodedSlashes On | 
|  | ProxyPass /r/ http://127.0.0.1:8081/r/ nocanon | 
|  | </VirtualHost> | 
|  | ---- | 
|  |  | 
|  | The two options 'AllowEncodedSlashes On' and 'ProxyPass .. nocanon' are required | 
|  | since Gerrit 2.6. | 
|  |  | 
|  | === SSL | 
|  |  | 
|  | To enable Apache to perform the SSL processing, use 'proxy-https://' | 
|  | in httpd.listenUrl within Gerrit's configuration file, and enable | 
|  | the SSL engine in the Apache VirtualHost block: | 
|  |  | 
|  | ---- | 
|  | <VirtualHost *:443> | 
|  | SSLEngine on | 
|  | SSLCertificateFile    conf/server.crt | 
|  | SSLCertificateKeyFile conf/server.key | 
|  |  | 
|  | ... same as above ... | 
|  | </VirtualHost> | 
|  | ---- | 
|  |  | 
|  | See the Apache 'mod_ssl' documentation for more details on how to | 
|  | configure SSL within the server, like controlling how strong of an | 
|  | encryption algorithm is required. | 
|  |  | 
|  | === Troubleshooting | 
|  |  | 
|  | If you are encountering 'Page Not Found' errors when opening the change | 
|  | screen, your Apache proxy is very likely decoding the passed URL. | 
|  | Make sure to either use 'AllowEncodedSlashes On' together with | 
|  | 'ProxyPass .. nocanon' or alternatively a 'mod_rewrite' configuration with | 
|  | 'AllowEncodedSlashes NoDecode' set. | 
|  |  | 
|  |  | 
|  | == Nginx Configuration | 
|  |  | 
|  | To run Gerrit behind an Nginx server, use a server statement such | 
|  | as this one: | 
|  |  | 
|  | ---- | 
|  | server { | 
|  | listen 80; | 
|  | server_name review.example.com; | 
|  |  | 
|  | location ^~ /r/ { | 
|  | proxy_pass        http://127.0.0.1:8081; | 
|  | proxy_set_header  X-Forwarded-For $remote_addr; | 
|  | proxy_set_header  Host $host; | 
|  | } | 
|  | } | 
|  | ---- | 
|  |  | 
|  | === SSL | 
|  |  | 
|  | To enable Nginx to perform the SSL processing, use 'proxy-https://' | 
|  | in httpd.listenUrl within Gerrit's configuration file, and enable | 
|  | the SSL engine in the Nginx server statement: | 
|  |  | 
|  | ---- | 
|  | server { | 
|  | listen 443; | 
|  | server_name review.example.com; | 
|  |  | 
|  | ssl  on; | 
|  | ssl_certificate      conf/server.crt; | 
|  | ssl_certificate_key  conf/server.key; | 
|  |  | 
|  | ... same as above ... | 
|  | } | 
|  | ---- | 
|  |  | 
|  | See the Nginx 'http ssl module' documentation for more details on | 
|  | how to configure SSL within the server, like controlling how strong | 
|  | of an encryption algorithm is required. | 
|  |  | 
|  | === Troubleshooting | 
|  |  | 
|  | If you are encountering 'Page Not Found' errors when opening the change | 
|  | screen, your Nginx proxy is very likely decoding the passed URL. | 
|  | Make sure to use a 'proxy_pass' URL without any path (esp. no trailing | 
|  | '/' after the 'host:port'). | 
|  |  | 
|  | If you are using Apache httpd server with mod_jk and AJP connector, add | 
|  | the following option to your httpd.conf directly or included from another | 
|  | file: | 
|  |  | 
|  | ---- | 
|  | JkOptions +ForwardURICompatUnparsed | 
|  | ---- | 
|  |  | 
|  | GERRIT | 
|  | ------ | 
|  | Part of link:index.html[Gerrit Code Review] | 
|  |  | 
|  | SEARCHBOX | 
|  | --------- |