diff options
author | HombreLaser <sebastian-440@live.com> | 2023-08-31 18:38:45 -0600 |
---|---|---|
committer | HombreLaser <sebastian-440@live.com> | 2023-08-31 18:38:45 -0600 |
commit | 317fdef2e21d65d21aae0c1d376b7d9c0241b9ae (patch) | |
tree | 4e0ecd1ab730959f9e9615d2c330d3ceea4af2ab /_i18n | |
parent | b33f6686a0dd8b3e4ae6029162f9ffae3a8b06ad (diff) |
Add english version ot the 2023-08-31 post
Diffstat (limited to '_i18n')
-rw-r--r-- | _i18n/en/_posts/2023-08-31-host_jekyll_apache.md | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/_i18n/en/_posts/2023-08-31-host_jekyll_apache.md b/_i18n/en/_posts/2023-08-31-host_jekyll_apache.md new file mode 100644 index 0000000..19aa3c4 --- /dev/null +++ b/_i18n/en/_posts/2023-08-31-host_jekyll_apache.md @@ -0,0 +1,136 @@ +--- +layout: post +title: "HOWTO: Host your jekyll site using apache web server" +date: 2023-08-31 18:27:00 +0000 +categories: jekyll self-host apache2 linux +--- + +I finally have a personal blog just how I like it. I wouldn't say it took a long time (just a couple of days) or that I'd rather have used +an overkill alternative, like WordPress. But I should recognize that it wasn't as easy as I thought it'd be. Besides the customizations +I made to the theme I use, I think the main responsible of my suffering hosting this blog was apache. + +And so I think that a guide of what to do to host a static site made in jekyll on a VPS with apache2 it's a good idea for a first post, +so let's get to it. A heads up: I already assume that you have your jekyll site ready and you're just looking on how to deploy it +to your server, so I'll omit the steps regarding a site's generation. + +# Requirements +- A VPS, whether using a hosting provider like vultr or a PC turned on 24/7 in your home. Just be sure that it is accessible to the public + internet (that it has a static public IP), which is the most important aspect of a web server. +- Some linux distro installed in your server. I personally use Debian, but the instructions presented here are distro-agnostic. +- Apache2 +- Ruby; I recommend [rbenv][rbenv] + +# Apache2 +If you wish to host your site in the apache's main directory (in the case of debian, it's /var/www/html/), and, as a consequence, in your main domain +(not a subdomain) then there's no extra configuration besides the one I'll show. If instead you'll host your blog on a subdomain, just beware that +there're certain things to have in mind, like your server's name and the directory that's going to store your blog files. + +I was looking for two things when setting up my server: **internationalization** and **pretty URLs**. The configuration I'll show takes into consideration +these two points, and it achieves them through [mod_rewrite][mod_rewrite]: + +{% highlight apache %} +<VirtualHost _default_:443> + ServerName example.com + + DocumentRoot /var/www/html/ + DirectoryIndex index.html + + RewriteEngine On + RewriteRule ^/(page[1-9]+)$ %{DOCUMENT_ROOT}/$1/index.html + RewriteRule ^/en/(page[1-9]+)$ %{DOCUMENT_ROOT}/en/$1/index.html + RewriteRule ^/en/$ %{DOCUMENT_ROOT}/en/index.html + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^([^\.]+)$ $1.html [NC,L] + + ErrorDocument 404 "/not-found" + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined +</VirtualHost> +{% endhighlight %} + +The first two rules relate to pagination, using the jekyl-paginate rubygem. If you won't use pagination, +you can omit it. Although I recommend you use it. + +The second one is a doozy, for now I'll only host the blog in english and spanish, although if I wish to, +in the future, add a third language, like french, I could change the regex to: + +`^/(en|fr)/(page[1-9]+)$` + +The same for the next one, which only takes care of serving the index of every internationalized index version. +The last three rules take care of pretty URLs (URLs without the file extension, e.g. about-me instead of about-me.html) + +The last configuration (ErrorDocument) is the page the server'll show every time there is a 404 status response. Chances +are the theme you're using for your blog already has one, and if not, it's worth it to create one because the apache's +default "Not found" page isn't particularly pleasing. + +# User permissions + +The /var/www/html directory usually belongs to the group (and user) www-data (in other distros this user is called apache), +but if you like you can add yourself to this group or even better, become the owner. Be mindful of security though, this directory +usually belongs to the root or www-data user, so it's probably worth it to create an user just for this and nothing else, and to not +have anything sensible in your /var/www/html directory, besides your blog's files: + +{% highlight shell %} +sudo chown -R $(whoami) /var/www/html +{% endhighlight %} + +I did this because it's useful if you wish to use git hooks, so that with every change you push, the site will update automatically, +so it behaves like a dynamic site, like a WordPress instance for example. + +# Deploy hook + +If you use a special user as the owner of your git repos, like me (my git user in my VPS doesn't have access to an interactive +shell for example) then you can add another remote repo and point towards it: + +## Server + +{% highlight shell %} +git --bare init your_blog.git +cd your_blog.git +touch hooks/post-receive +{% endhighlight %} + +## Client (where you write your posts) + +{% highlight shell %} +git remote add deploy your_user@example.com:/home/your_user/your_blog.git +git push deploy +{% endhighlight %} + +## Post-receive script + +Now, the script that'll be executed everytime you push any changes is the following, courtesy of [the jekyll docs][jekyll_docs]. +I modified it as I use rbenv, it'll be the same for you if you use it as well, but if you installed ruby and bundler with, for example, +your package manager, then you won't have to add your rubygems' directory to your PATH, but if you installed ruby in any other way, it'll +be required. + +{% highlight shell %} +#!/bin/bash -l + +export GEM_HOME=$HOME/.rbenv/shims/ +export PATH=$GEM_HOME:$PATH + +GIT_DIR=$HOME/blog.git +TMP_GIT_CLONE=$HOME/tmp +GEMFILE=$TMP_GIT_CLONE/Gemfile +PUBLIC_WWW=/var/www/html # Use the directory apache uses for serving your blog. + +git clone $GIT_DIR $TMP_GIT_CLONE +BUNDLE_GEMFILE=$GEMFILE bundle install +BUNDLE_GEMFILE=$GEMFILE bundle exec jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW +rm -Rf $TMP_GIT_CLONE +exit +{% endhighlight %} + +# Conclusions + +Well, that was the _setup_ of my website. I personally think there is a technical barrier to using jekyll, and it's a shame +because it covers a lot of use cases pretty well, but us technical users sometimes forget that what could be easy for us, +like a git push, it's kind of black magic to others, and let's just not talk about that giant apache config file or having +to write a git hook. Nevertheless, I enjoy jekyll, I enjoyed this process and I hope you do, too. + +[rbenv]: https://github.com/rbenv/rbenv +[mod_rewrite]: https://httpd.apache.org/docs/2.4/rewrite/intro.html +[jekyll_docs]: https://jekyllrb.com/docs/deployment/automated/ |