| = 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 | |
| --------- |