If you can see this check that
Essential Apache
Configuring Apache
Apache
- Very well known and respected http server.
- Used commercially.
- Freely available from http://www.apache.org
- Plenty of plugins.
- Relatively easy and flexible to configure.
- Fast and Reliable.
Server Architectures
- In most designs of server, you either use
- Threaded model
- Forking model
- Asynchronous Architecture
- A threaded model needs special OS support to provide lightweight threads. Not used in Apache for security and reliability reasons.
- Forking means that each new request which arrives is handled by a whole process. This is the Apache way.
- Asynchronous. Some web servers exist with this model, where one process handles everything with complex IO code. Good for fast processing of simple web pages.
Apache Forking Model
Initial Settings
| StartServers | 8 |
| MinSpareServers | 5 |
| MaxSpareServers | 20 |
| MaxClients | 150 |
| MaxRequestsPerChild | 1000 |
- These options are important, but often the least likely to be changed from the defaults!
Important Files
- /etc/init.d/httpd - the server control script
- /etc/httpd/conf/http.confg - the main conf file.
- Remember when changing the configurations it is only reread on a server reload or restart.
- Errors and other details are logged by default in /var/log/httpd/ as access_log, error_log, as suexec.log.
Reload or Restart
- Reload is the best option to use.
- With a reload, apache checks your configuration file, and switches to it only if it contains no errors.
- If it has errors, it keeps using the old configuration.
- This allows you to reconfigure a server with no downtime.
- Restart shuts down then starts the server...
- Due to a bug in apache restart can cause problems in linuxzoo.net.
- Look in the error log for help (e.g. /var/log/httpd/error_log), or syslog (e.g. /var/log/messages).
Mimic a Browser
- To understand how a sever is running is it sometimes useful to make requests at the keyboard of a server and see the results as text.
- Telnet can do this, so long as you have learned some basic HTTP commands.
- The two important ones are:
- HEAD - Give information on a page.
- GET - Give me the whole page.
- In HTTP 1.1 we can use virtual hosts.
- This allows multiple hosts to share a single server.
- Each host has a different name.
- The name of the host you want to answer a query is given as part of a page request.
- This is only supported in HTTP 1.1 and beyond.
$ telnet linuxzoo.net 80
HEAD / HTTP/1.1
Host: linuxzoo.net
HTTP/1.1 200 OK
Date: Mon, 01 Nov 2008 15:06:44 GMT
Server: Apache/2.0.46 (Red Hat)
Last-Modified: Fri, 29 Oct 2008 14:47:22 GMT
ETag: "4981dd-920-22ea7280"
Accept-Ranges: bytes
Content-Length: 2336
Content-Type: text/html; charset=UTF-8
$ telnet linuxzoo.net 80
HEAD / HTTP/1.1
Host: db.grussell.org
HTTP/1.1 200 OK
Date: Mon, 01 Nov 2008 15:08:52 GMT
Server: Apache/2.0.46 (Red Hat)
Last-Modified: Thu, 21 Oct 2008 09:12:33 GMT
ETag: "3c8066-a37-86c9a240"
Accept-Ranges: bytes
Content-Length: 2615
Content-Type: text/html; charset=UTF-8
VirtualHosts
public_html
- Where apache runs on a server used by many different servers, it would be useful for each user to be able to build their own web pages which the server could serve.
- But the virtualhost configuration takes only a single document root, and each user has their own directories in /home.
- You could make the root /home
- All of the files in /home would be accessible, not just web pages.
- It's a bit disgusting...
- Instead, apache supports web pages appearing in a users home directory, under the subdirectory public_html.
public_html access
- Urls of the form
- http://linuxzoo.net/~gordon/file.html
- Refer to
- /home/gordon/public_html/file.html
- This feature must first be switched on in httpd.conf.
- To activate it, find the line
- Then either delete the line, or put "#" (the comment character) in front of it.
- Remember to reload the server.
Linuxzoo tutorials
Web access from the prompt
- The prompt is fast and convenient for admin purposes, but when you are debugging http sometimes "telnet" is not sufficient.
- There are a few other tools you can use at the prompt.
- However, there is no simple replacement for actually using a real browser to check your pages.
$ elinks http://linuxzoo.net
Copy http to your directory
- lwp-request http://linuxzoo.net > file.html
- The data is obtained and then printed to the screen.
- In this case that is redirected to file.html
- wget http://linuxzoo.net
$ wget http://linuxzoo.net
--19:20:11-- http://linuxzoo.net/
Resolving linuxzoo.net... 146.176.166.1
Connecting to linuxzoo.net|146.176.166.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4785 (4.7K) [text/html]
Saving to: `index.html'
100%[=======================================>] 4,785 --.-K/s in 0s
19:20:11 (304 MB/s) - `index.html' saved [4785/4785]
mod_rewrite
URL Rewriting
- A useful module in apache is mod_rewrite.
- This allows us to change URLs dynamically.
- This can be useful to, for example,
- Change the URL of aliases in a domain so that they always give the name you want.
- Support directories and files being moved without breaking bookmarked URLs.
- Provide a variety of proxying methods.
Methods
- mod_rewrite has many functions...
- The key functions are:
- RewriteCondition - an IF statement
- RewriteRule - an action (doit) statement.
- These can be placed almost anywhere in the apache configuration files.
- We will concentrate on their use in VirtualHost areas of httpd.conf.
- To work, the area must also have:
RewriteEngine on
rewriteRule
- Basic for of this rule is:
RewriteRule URL-reg-exp New-URL
- For instance, you have moved /old.txt to /new.txt
RewriteRule /old.txt /new.txt
Regular Expressions
- The match comparison is a regular expression.
- Useful aspects of regular expressions include:
- Text matching:
. Any single Character
[chars] One of the characters in chars
[^chars] None of the characters in chars
Text1|Text2 Either "Text1" or "Text2"
Quantifiers and Grouping
- Quantifiers:
? 0 or 1 of the preceding text
* 0 or N of the preceding text
+ 1 or N of the preceding text
- Grouping
(text) A text group - Can mark the border of an alternative or for RHS reference as $N
Anchors and Escaping
- Anchors:
^ Start of the URL
$ End of the URL
- Escaping
\char Allows you to use a character as the "char". For instance, \^ is the ^ character and not the start of the URL.
Back References
- $N corresponds to a group from the URL match.
- For example, rewrite any URL ending in .txt to .html one could write:
RewriteRule (.*)\.txt $1.html
More complex example.
- Rewrite a URL ending with directory /demo/ to use /hia/ instead...
RewriteRule ^(.*)/demo/(.*)$ $1/hia/$2
Additional Flags
- At the end of the RewriteRule can be a number of flags.
- The Flags are listed in [brackets], eg [F,G] for flags F and G.
- These change or enhance the behaviour of the match.
Options:
- R or R=code - This sends the browser the new URL as an external REDIRECTION. The code can be the type or redirection, such as 302 for MOVED TEMPORARILY (the default).
- F - Send back FORBIDDEN.
- G - Send back GONE
- P - Proxy - Forward the request
- L - Last - do not look at any more rules.
- C - chain - If the pattern matches do the next rule, otherwise ignore the remaining rules.
- NC - case insensitive.
- There are many more options, but these are the important ones.
Complex example
RewriteCond
- This command performs tests or RULES.
- If the test matches, then the next test is checked.
- If all tests match, then the RewriteRule which follows the tests is performed.
- If any Cond does not match, processing skips on till after the Rule(s) in this block.
- Basic Form of RewriteCond
RewriteCond TestString ConditionString
- The value of the TestString is compared to the conditionstring.
- Condition String can be any type of regular expression.
- TestString can be one of a huge variety of things, including variables and file tests.
Variables:
- Here are some of the important variables:
- REMOTE_ADDR
- REMOTE_HOST
- HTTP_HOST
- REQUEST_URI (e.g. /index.html)
- REQUEST_FILENAME (e.g. /home/gordon/...)
- You use these as %{REMOTE_ADDR} etc.
- There are over 20 variables available.
Flags
- RewriteCond can take flags in the same way as RewriteRule.
- There are only 2 flags:
- NC - case insensitive
- OR - or the Conds together.
- Normally all rules have to be true before the Rule is done, with OR the rule is done if ANY Cond is true.
Example 1:
Example 2:
Example 3:
- Rewrite *.grussell.org to grussell.org, and *.grussell.org.uk to grussell.org.uk.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^.+grussell\.org$
RewriteRule ^(.*)$ http://grussell.org$1 [L,R]
RewriteCond %{HTTP_HOST} ^.+grussell\.org\.uk$
RewriteRule ^(.*)$ http://grussell.org.uk$1 [L,R]
Discussions
Discussion
- Apache runs as a user, usually "apache" or "httpd". For apache to serve a file from a user's public_html directory, what permissions would be required?
Discussion
- Here are some mock exam questions you should now be able to answer:
Question 1
- To test a web server which is hosting the virtual host "grussell.org", using only telnet, what would you type at the telnet prompt?
Question 2
What fields would you expect to have to define in a VirtualHost definition in apache?
Question 3
Supply mod_rewrite instructions such that a request for http://grussell.org/~uta gets redirected externally and permanently to http://upriss.org.uk.