@@ -139,158 +139,11 @@
139 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
| contributions] to cover these as well. We also welcome contributions
140 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to fill gaps (❌) in the table above.
141 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
142 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="ext">CGI Server Extensions</h2>
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In addition to serving Fossil repositories via CGI, Fossil can
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- itself [./serverext.wiki | launch other programs via CGI] to
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- implement server extensions. Do not confuse these two concepts. This
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extension mechanism works regardless of the method above you choose
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to serve your Fossil repository.
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="tls">Securing a repository with TLS</h2>
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil's built-in HTTP server (e.g. "fossil server") does not support
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TLS, but there are multiple ways to protect your Fossil server with
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TLS. All of this is covered in a separate document, <a
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- href="./ssl.wiki">Using TLS-Encrypted Communications with Fossil</a>.
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="chroot">The Fossil Chroot Jail</h2>
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If you run Fossil as root in any mode that serves data on the
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- network, and you're running it on Unix or a compatible OS, Fossil
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will drop itself into a [https://en.wikipedia.org/wiki/Chroot |
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- chroot jail] shortly after starting up, after
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- it's done everything that requires root access. Most
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- commonly, you run Fossil as root to allow it to bind to TCP port 80
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for HTTP service, since normal users are restricted to ports 1024
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and up on OSes where this behavior occurs.
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil uses the owner of the Fossil repository file as its new user
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ID when dropping root privileges.
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- When this happens, Fossil needs to have all of its dependencies
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inside the chroot jail. There are several things you typically need
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in order to make things work properly:
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <ul>
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>the repository file(s)
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><tt>/dev/null</tt> — create it with <tt>mknod(8)</tt> inside the
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- jail directory ([https://fossil-scm.org/forum/forumpost/90caff30cb |
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Linux example])
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><tt>/dev/urandom</tt> — ditto
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li>any shared libraries your <tt>fossil</tt> binary is linked to,
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- such as <tt>/lib/libssl.so</tt>; consider
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <tt>[https://www.fossil-scm.org/fossil/doc/trunk/www/build.wiki |
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ./configure --static]</tt> to avoid the need for this
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ul> </blockquote>
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil does all of this in order to protect the host OS. You can make it
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bypass the jail part of this by passing <tt>--nojail</tt> to <tt>fossil server</tt>,
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- but you cannot make it skip the dropping of root privileges, on purpose.
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2 id="loadmgmt">Managing Server Load</h2>
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote>
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- A Fossil server is very efficient and normally presents a very light
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- load on the server.
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The Fossil [./selfhost.wiki | self-hosting server] is a 1/24th slice VM at
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [http://www.linode.com | Linode.com] hosting 65 other repositories in
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addition to Fossil (and including some very high-traffic sites such
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- as [http://www.sqlite.org] and [http://system.data.sqlite.org]) and
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- it has a typical load of 0.05 to 0.1. A single HTTP request to Fossil
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- normally takes less than 10 milliseconds of CPU time to complete, so
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- requests can be arriving at a continuous rate of 20 or more per second,
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and the CPU can still be mostly idle.
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- However, there are some Fossil web pages that can consume large
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- amounts of CPU time, especially on repositories with a large number
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of files or with long revision histories. High CPU usage pages include
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [/help?cmd=/zip | /zip], [/help?cmd=/tarball | /tarball],
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [/help?cmd=/annotate | /annotate] and others. On very large repositories,
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- these commands can take 15 seconds or more of CPU time.
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If these kinds of requests arrive too quickly, the load average on the
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server can grow dramatically, making the server unresponsive.
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil provides two capabilities to help avoid server overload problems
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- due to excessive requests to expensive pages:
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <ol>
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><p>An optional cache is available that remembers the 10 most recently
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- requested /zip or /tarball pages and returns the precomputed answer
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if the same page is requested again.</p>
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <li><p>Page requests can be configured to fail with a
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4 | "503 Server Overload"]
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- HTTP error if an expensive request is received while the host load
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- average is too high.</p>
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </ol>
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Both of these load-control mechanisms are turned off by default, but they
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- are recommended for high-traffic sites.
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The webpage cache is activated using the [/help?cmd=cache|fossil cache init]
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- command-line on the server. Add a -R option to specify the specific repository
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for which to enable caching. If running this command as root, be sure to
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "chown" the cache database (which is a separate file in the same directory
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and with the same name as the repository but with the suffix changed to ".cache")
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to give it write permission for the userid of the web server.
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To activate the server load control feature
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- visit the Admin → Access setup page in the administrative web
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- interface; in the "<b>Server Load Average Limit</b>" box
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- enter the load average threshold above which "503 Server
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Overload" replies will be issued for expensive requests. On the
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self-hosting Fossil server, that value is set to 1.5, but you could easily
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set it higher on a multi-core server.
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The maximum load average can also be set on the command line using
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- commands like this:
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil set max-loadavg 1.5
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil all set max-loadavg 1.5
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The second form is especially useful for changing the maximum load average
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- simultaneously on a large number of repositories.
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Note that this load-average limiting feature is only available on operating
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- systems that support the "getloadavg()" API. Most modern Unix systems have
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this interface, but Windows does not, so the feature will not work on Windows.
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Note also that Linux implements "getloadavg()" by accessing the "/proc/loadavg"
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- file in the "proc" virtual file system. If you are running a Fossil instance
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inside a chroot() jail on Linux, you will need to make the "/proc" file
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- system available inside that jail in order for this feature to work. On
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the [./selfhost.wiki|self-hosting Fossil repositories], this was accomplished
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- by adding a line to the "/etc/fstab" file that looks like:
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><pre>
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- chroot_jail_proc /home/www/proc proc ro 0 0
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </pre></blockquote>
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The /home/www/proc pathname should be adjusted so that the "/proc" component is
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in the root of the chroot jail, of course.
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To see if the load-average limiter is functional, visit the [/test_env] page
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of the server to view the current load average. If the value for the load
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- average is greater than zero, that means that it is possible to activate
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the load-average limiter on that repository. If the load average shows
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- exactly "0.0", then that means that Fossil is unable to find the load average
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (either because it is in a chroot() jail without /proc access, or because
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- it is running on a system that does not support "getloadavg()") and so the
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- load-average limiter will not function.
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </blockquote>
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2 id="more">Further Details</h2>
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <a name="chroot"></a>[./chroot.md | The Server Chroot Jail]
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <a name="loadmgmt"></a>[./loadmgmt.md | Managing Server Load]
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <a name="tls"></a>[./ssl.wiki | Securing a Repository with TLS]
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <a name="ext"></a>[./serverext.wiki | CGI Server Extensions]
297 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!