After setting up the blog, I ran into several problems, two of them were that I didn’t have syntax highlighting and nginx redirected requests to paths without
/ at the end to wrong URL.
Pygments is a Python library used by Hugo to generate syntax highlighting for static HTML pages. Installing it locally is simple, just run
pip install Pygments
However, I am using Travis to automate the build process. Therefore, I need to tell Travis to install Pygments before running the build. Fortunately, Travis supports multiple languages for setting up the container. All I have to do is specify the python version I want to install in
language: go go: - 1.7.x python: - "2.7"
And then in
install phase, I need to tell Travis to install Pygments. To simplify the build script, I just run
sudo so that I don’t have to go through all the virtual environment setup.
install: - sudo pip install Pygments
However, in order for that to work, I also need to tell Travis that I need access to
sudo in order to set up my container. Just add
sudo: required to
.travis.yml will do the job.
Nginx configuration for Dokku
Another problem was that Nginx redirected requests to paths without
/ to wrong URL. For example
GET http://tannguyen.org/tags/hugo - 302 (redirected to http://tannguyen.org:5000/tags/hugo/) GET http://tannguyen.org/tags/hugo/ - 200
The redirected path is correct but the port is wrong.
5000 is the port of the Docker container used to run my blog. So, either I need to make sure that nginx does not use internal port for redirecting requests or make sure all my blog URLs have
/ at the end. I decided to go with the later because it’s easier to do and also make my blog URLs consistent.
In my setup there are 2 nginx servers running, one for handling public requests to the main domain and the other one is used internally to serve HTML pages generated by Hugo. Dokku allows me to overwrite its nginx configuration by simply having a
nginx.conf.sigil file in the folder that I am going to deploy. Now it’s only the matter of configuring nginx to force trailing slash for all URLs, just add the following rewrite rule to the
rewrite ^([^.]*[^/])$ $1/ permanent;
In my set up, I make it so that the auto generated
public folder is used for tar deployment to Dokku server. Therefore, I have to put
nginx.conf.sigil outside that folder because it’s in
.gitignore. For my own convention, I put all the files that need to be copied to
public for deploying to
.dokku folder and then add this to
after_success: - cp -fv .dokku/* public
If you are curious about the final setup, you can take a look at the source code