Based on Debian 11 "Bullseye" environment.

Concrete CMS

Concrete CMS (former Concrete5) is a CMS (Content Management System). Unlike WordPress, it focuses on independent pages than blog posts (seems so to me).

The installation process is well documented at the Concrete CMS official site. Here I add some details of how to integrate with nginx.

Download Concrete CMS

Download file is available at Concrete CMS official site. Check the URL for the latest version.
Move to the directory you want to store the Concrete CMS files and start downloading.

$ wget ' depending on the version)'

Once you download, you’ll get the zip file probably without the extension ".zip". Never mind about the filename and just unzip it.

$ unzip 3254ddbf-35f0-...

There will be "concrete-cms-9.0.2" (or later version number) directory. Rename this directory to whatever you like. The index.php in this directory will be the site top.
Before starting the Concrete5 installation, some directories have to be writable by the webserver. Changing all files owner to the www-data is the quickest way.

# chown -R www-data:www-data concrete-cms-9.0.2

Prepare database

Prepare a database on MariaDB for this Concrete CMS. An empty database and a user with full access are required.

# mariadb <- Login MariaDB as root
MariaDB [(none)]> create database concrete_cms;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> create user 'concrete'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> grant all on concrete_cms.* to 'concrete'@'localhost';
Query OK, 0 rows affected (0.000 sec)

Configuration for nginx

The example for PHP site configuration is already shown in the nginx installation article. For Concrete CMS, an additional tweak is required.

server {
        listen 80;
        listen [::]:80;
        return 301 https://$host$request_uri;

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/;


        root /var/www/concrete-cms;

        index index.php;

        location / {
                try_files $uri $uri/ =404;

        # pass PHP scripts to FastCGI server
        location ~ \.php($|/) {
                include snippets/fastcgi-php.conf;
                # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/run/php/php-fpm.sock;

The point is “\.php$” has to be changed to “\.php($|/)”. Because Concrete CMS URL looks ~/index.php/pagename, regex “\.php$” is not enough.

Setup Concrete CMS

Now you should see the installation screen by accessing the designated URL.
The installer will check the PHP modules and show the missing ones. They are available as Debian packages.

  • DOM Extension Enabled
    -> php-xml
  • Image Manipulation Available
    -> php-gd
  • XML Support
    -> php-xml (same as DOM Extension)
  • Internationalization Support
    -> php-mbstring
  • Zip Support
    -> php-zip

On the next screen, the site information is required. The database server is localhost (or your database server), and other data are what you’ve just set above.

The install process will go on and you will be logged in as “admin”. Next time you log in, you need to be “admin”, not the mail address you typed at the installation screen.

Update History


  • Update to Concrete CMS 8.5.6 on Debian 11 version
  • Change description of Concrete5 to Concrete CMS


  • Update to Concrete CMS 9 series on Debian 11