macOS: Install nginx, MySQL and PHP via brew

Since I was not satisfied with the performance of MAMP PRO and also used my local development environment mainly within the scope of localhost and not within multiple hosts, I decided to install a combination of nginx, MySQL and PHP via brew.

brew is a package manager, which allows to install many packages without a hassle.

Following I show you the fast installation of the packages and their basic configuration on macOS.

nginx

You can start the installation via the following command in your Terminal:

brew install nginx
Code language: Bash (bash)

The initial configuration can be found in the directory /usr/local/etc/nginx (or in /opt/homebrew/etc/nginx for Macs with Apple Silicon). At first, edit the nginx.conf in this directory, e.g. with this command:

pico /usr/local/etc/nginx/nginx.conf
Code language: Bash (bash)

To use PHP later on you need to adjust this block:

location / { root html; index index.html index.htm; }
Code language: Nginx (nginx)

So that it looks like this:

root /path/to/webroot; index index.html index.htm index.php; location / { autoindex on; try_files $uri $uri/ /index.php?$args; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; }
Code language: Nginx (nginx)

You need to set the path to your web root in the first line, which will be displayed after opening http://localhost in your browser. The line starting with index defines, which files will be accessed directly while opening a directory. Here you need to add the index.php at the end.

autoindex on; allows you to display the directory tree if there is no file specified in index. This is helpful for development, especially if you have multiply projects in sub-directories. Please never enable this function in a production environment.

The try_files directive declares how nginx tries to access a requested file. The given variant should fit the need of most applications. If you need a different, it should be found in the documentation of the particular application.

The different proxy buffer settings fix some issues with bigger websites (e.g. if they send large headers).

To be able to user PHP later on, you also need to add the following block below the one from above:

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Code language: Nginx (nginx)

By default, nginx runs on port 8080 since port 80 and 443, which are usually used for HTTP and HTTPS, can only be used with administrator permissions on macOS. If you want to use port 80, you need to adjust the following line:

listen 8080;

To:

listen 80;

Afterwards, you can start nginx with the following command:

brew services run nginx
Code language: Bash (bash)

Or as administrator via sudo:

sudo brew services run nginx
Code language: Bash (bash)

If you want to start the nginx server on system boot, you can use the following command instead:

brew services start nginx
Code language: Bash (bash)

Note: If you need to start nginx with administrator permissions to use port 80, it’s not possible to automatically start it on system boot.

To stop the server, you can use the following command:

brew services stop nginx
Code language: Bash (bash)

And to restart it, use the restart command:

brew services restart nginx
Code language: Bash (bash)

This command chain can be used for all services of brew, so also for MySQL and PHP (you just need to replace the nginx at the end to mysql or php).

MySQL

To install MySQL, you can use the following command in your Terminal:

brew install mysql
Code language: Bash (bash)

The configuration file can be found in /usr/local/etc/my.cnf (or in /opt/homebrew/etc/my.cnf for Macs with Apple Silicon) and can be opened similar to the nginx configuration:

pico /usr/local/etc/my.cnf
Code language: Bash (bash)

As basis you should use at least the following configuration:

# Default Homebrew MySQL server config [mysqld] # Only allow connections from localhost bind-address = 127.0.0.1 mysqlx-bind-address = 127.0.0.1 socket = /tmp/mysql.sock character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci character-set-client-handshake = false
Code language: PHP (php)

If the service is already running after the installation, you should restart it now:

brew services restart mysql
Code language: Bash (bash)

To test if the MySQL server is running, you can enter the following command:

mysql -u root -p

The default password for user root is also root. I leave that value in my local test environment.

If everything works, the output should look like the following:

$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 39 Server version: 8.0.25 Homebrew Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
Code language: JavaScript (javascript)

PHP

Even PHP can be installed via a single command in the Terminal:

brew install php
Code language: Bash (bash)

Currently, PHP 8.0 will be installed using this command. If you want to install another version, you can do it like this:

brew install php@7.4
Code language: Bash (bash)

This way, PHP 7.4 will also be installed if you already used the first command.

Similar to Linux, every PHP version has its own configuration directory in /usr/local/etc/php (or in /opt/homebrew/etc/php for Macs with Apple Silicon):

ls -l /usr/local/etc/php total 0 drwxr-xr-x 10 matze admin 320 Jul 3 15:55 7.4 drwxr-xr-x 10 matze admin 320 Jul 1 18:23 8.0

The php.ini can be found in the directory of every version, e.g. in /usr/local/etc/php/8.0/php.ini.

Switch between PHP versions

To switch between PHP versions, you can use the unlink and link commands of brew.

To switch to PHP 7.4, use the following commands:

brew unlink php brew link php@7.4 --force --overwrite
Code language: Bash (bash)

To switch back, just replace the values of php and php@7.4 in the commands:

brew unlink php@7.4 brew link php --force --overwrite
Code language: Bash (bash)

Before doing that, please make sure to stop any current running PHP version via brew services stop php or brew services stop php@7.4.

Afterwards, restart your Terminal session to apply the changes.

Leave a Reply

Your email address will not be published.