Installation of NGINX in macOS (Homebrew)
NGINX (pronounced Engine-X) is a popular web server that serves websites and web applications. This article will detail how to install and configure NGINX in macOS.
macOS lacks a proper package manager. Fortunately, Homebrew does a good job filling the void of a package manager. You can find more details and installation instructions here.
Installation
With Homebrew, you can easily install NGINX as follows:
brew install nginx
Configure a site
I use dnsmasq, a DNS caching utility, to implement a local domain with the TLD .test. The local domains are for SaaS (software as a service - multi-tenancy) applications that use subdomains to differentiate between tenants (ex: tenant1.example.com, tenant2.example.com).
This is an example for site:
Create a new file under /usr/local/etc/nginx/servers/<site> and add the following details. I use NeoVIM, so it looks like:
nvim /usr/local/etc/nginx/servers/jdeen.test
upstream jdeentest {
    server unix:/tmp/jdeencom.sock max_fails=3 fail_timeout=600;
}
server {
    listen 80;
    server_name *.jdeen.test;
    root /Volumes/Dev/JDeen/Projects/JDeenCOM/jdeencom/public;
    try_files $uri/index.html $uri @jdeentest;
    error_log /Volumes/Dev/JDeen/Projects/JDeenCOM/jdeencom/log/nginx-error.log;
    access_log /Volumes/Dev/JDeen/Projects/JDeenCOM/jdeencom/log/nginx-access.log;
    location @jdeentest {
        proxy_pass http://jdeentest;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}
brew services failure
I find managing NGINX services through brew (brew service) unreliable. Running the application gives me an error code 256.
⇒  brew services list
Name               Status     User  File
mysql              none
nginx              error  256 root  ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
postgresql         started    root  ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis              started    jdeen ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
jdeen@iMac:/Volumes/Dev/JDeen/Projects/JDeenCOM/jdeencom|master
⇒  brew services start nginx | pbcopy
Bootstrap failed: 5: Input/output error
Try re-running the command as root for richer errors.
Error: Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/jdeen/Library/LaunchAgents/homebrew.mxcl.nginx.plist` exited with 5.
Direct usage
While brew services fails to deliver results, you can use nginx directly.
sudo nginx           # Start nginx
sudo nginx -s stop   # Signal the main process to stop
sudo nginx -s reload # Signal the main process to reload configuration
Running nginx -help will give you a list of options at your disposal.
⇒  nginx -help
nginx version: nginx/1.23.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]
Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/Cellar/nginx/1.23.1/)
  -e filename   : set error log file (default: /usr/local/var/log/nginx/error.log)
  -c filename   : set configuration file (default: /usr/local/etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file
Conclusion
NGINX is a favourite among many web application development circles, especially Ruby on Rails. While macOS is also a favourite among the developer community, the use of applications intended for Linux is not always straightforward. But with a little work arround and extra steps, you can get the desired behaviour.
About the Author
Ziyan Junaideen -
Ziyan is an expert Ruby on Rails web developer with 8 years of experience specializing in SaaS applications. He spends his free time he writes blogs, drawing on his iPad, shoots photos.