Tag Archives: apache2

HTML Tidy on Ubuntu

Uh… this could have been a tweet instead of a post.

in your terminal, paste:

apt-get install php5-tidy

Answer “y” when asked. Done.

Just to make this last longer… if this doesn’t do the trick, you aren’t logged in as root. try:

sudo apt-get install php5-tidy

Restart Apache

service apache2 restart

Now, really, I’m done. Seriously.

Pagespeed + Apache2 on Ubuntu Server

I try and get all my installing done before I get into putting files on the server. So, if I wreck something and have to start over, I haven’t wasted a lot of upload and setting up time.

This server I am describing runs Ubuntu Server and I am using it to run a few wordpress sites. WordPress being a resource hog (charming as it is), I want to keep things peak. If it seems excessive, I can always drop the excessive later.

Google’s mod_pagespeed

I have not used this before, but I heard that it compresses images, and that’s good enough for me to give it a shot, rather than fiddle with smush.it plugins that can’t reach many images called the most. I can remember to compress all before uploading, but seriously, who remembers? mod_pagespeed is in beta, but I’m going on trust, seeing as how the project has active development.

So here goes. Pretty straightforward. Get debian package, install. went without a hiccup this one. Easily the least complicated so far.

wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-beta_current_amd64.deb
sudo dpkg -i mod-pagespeed*.deb

service apache2 restart

Now edit /etc/apache2/mods-available/pagespeed.conf and add your cdn (if any) so that pagespeed knows to optimize those files too.

service apache2 restart

Update: I disabled pagespeed after my CPU usage started spiking rapidly and dangerously. I suppose it can be configured better, So I will come back to it at a later date. Too busy to do any extensive tinkering and babying right now.

Update: I have been able to get this to work most excellently – even for my efficeincy obsessed mind – post coming up with my settings and logic soon.

Configuring Varnish Cache for WordPress

Oh, so you installed Varnish, what good will it do, if most of your content is not cached? I went for the “Preparing Varnish/Wordpress? for a Slashdotting in 60 seconds or less… ” code provided on the Varnish site. Its rather ruthless, but I’m not particularly attached to seeing the logged in version of my websites that I want Varnished anyway. Few log in to them. Ruthless works for me. So here’s how to do it. Please note that there is a change of code since that sample was provided, which I have corrected below. Feel free to plug and play.

Edit your /etc/default/varnish file and edit the port and cache size in.

DAEMON_OPTS=”-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1gb”

Port is at 6081, which you change to 80. Set the storage size as per your needs. Don’t obsess over it. You can always edit if needed later.

Then, in /etc/varnish/default.vcl paste the following code.

backend default {    .host = "localhost";    .port = "8080";    .max_connections = 30;    .connect_timeout = 4.0s;    .first_byte_timeout = 600s;    .between_bytes_timeout = 600s;
}

# Drop any cookies sent to WordPress.        sub vcl_recv {                if (!(req.url ~ "homeschoolingindia.in|phpmyadmin|wp-(login|admin)")) {                        unset req.http.cookie;                }        }
# Drop any cookies WordPress tries to send back to the client.        sub vcl_fetch {                if (!(req.url ~ "phpmyadmin|wp-(login|admin)")) {                        unset beresp.http.set-cookie;                }        }

You don’t have to configure everything. What you don’t configure falls back on pretty decent defaults. What is being done here is that all cookies are dropped so that the page becomes cachable, unless you are accessing login or admin, where you need cookies to be able to access. I had some trouble with interaction on the front page. No admin option was available, since this was the production version I was seeing. Making comments was a problem.

The solution was rather simple. I installed the Discus plugin to handle comments. It formats them rather nicely, magages efficiently, integrates reasonably well with wordpress, adds features like likes and shares along with the oh so fabulous lists of mentions. However, the bestest part is that it is delivered through javascript, so it is totally functioning when the page is cached.

Other problems likely may be using any analytics software from the server end. Since most requests will not reach the server at all, there is no way for the server to record hits and so on. Again, javascript to the rescue. What do I say. In my opinion, google analytics works best for my needs anyway.

So, you understand the theme of the matter, basically, you are not going to be pulling any customized pages. Javascript being rendered in the browser, couldn’t care less if it were served from a html page or php. Your adsense will work, so will analytics. Some “link selling” plugins that rely on php may not register as active with your providers, but then you shouldn’t be selling I’ll not comment on the ethics of that…. This site, AamJanataWide Aware and Nisarga run like that.

However, this brings us to the site that won’t work. A site that users login and use. You got that right. BuddyPress. Homeschoolingindia.in is not getting the varnish treatment. I guess you could do it so that you use varnish with non logged in users, if you have a lot of non-member visitors. I found it simpler to leave it out.

Two possibilities. The first is to exclude it through varnish. Either by passing requests through for target domain or configuring Varnish per domain, and not for this one. Please to also remember to exclude it in the cookie killing settings. Many possibilities depending on what you want.

The second option is what I did, because it was simple and I had an extra IP from my provider. Configure all sites to be cached to answer on one IP on your backend port 8080 in this example and those not to be cached to answer on port 80 (the regular port) on the second IP. In the default.vcl, in the backend configuration, replace localhost with the IP address serving sites to be cached on port 8080. Done. Your buddypress is now happily guzzling scandalous amounts of resources, while your other wordpresses are playing static html. ;)

There is more, much more, but I find that this is adequate for basic configuration. Later, as you get used to the cache, you will be able to analyze what is happening, and filter in more and more hits to the cache and reduce server load further, but that is another how to in itself, if at all I have the competency to write it.

This should keep your server from crashing under whatever it is that guzzles up memory.

Please note that these are my learnings as I struggle to find out things. I am not a professional. Only a  person who wanted to build a website. I am cutting through the massive finding out missions I had to take and providing the results of that learning. No guarantees, though whatever I say here is working according to my server.

If you would like something more tweakable (and complicated), with load balancing and multiple servers for one site, etc. Try here

Note: This post is old. Soon, there is one more coming up with more nuanced settings, and alternative vcls.

Fresh Server Install – Ubuntu Server Edition

Your VPS offers you the possibility of a fresh installation, reinstall OS they call it. Do that. Use Ubuntu 10.10

Please note that I am no computer expert, I am telling you what worked for me.

The default installation of Ubuntu doesn’t have locale set. You will get “locale failed” variety errors when you install anything.

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_IN"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

More irritating than anything else. So we get rid of that.

apt-get install language-pack-en-base

If you get an error about missing package, etc. Run

apt-get update

and try again.

Then you may have to insert the code for your location.

/usr/sbin/locale-gen en_IN.UTF-8

and

/usr/sbin/update-locale LANG=en_IN.UTF-8

Irritants out of the way, this is the time to do any upgrades you may wish. I brought my server to the latest like so:

sudo apt-get install update-manager-core

Check that /etc/update-manager/release-upgrades has Prompt = normal (default) and run

sudo do-release-upgrade

I generally replace most configuration files with “vendor versions” – I haven’t actually customized anything so far.

This done, I am ready to move to the next step. I have decided on using Varnish as the cache, LAMP, APC opcode cache. I will also be using virtual hosts to host different domains, but that is last.

There is a reason for this sequence. If something messes up, I can click the reinstall button, and there is very little big effort gone into it. So, the tricky stuff comes before the time consuming stuff – as long as there is no dependency.