Created
October 31, 2021 04:53
-
-
Save phamngsinh/31d6ab1c653db1c17482686aa0b73a7b to your computer and use it in GitHub Desktop.
macOS 11 Dnsmasq MailHog Redis Nginx Multiple PHP Versions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Setup | |
| Before starting you need xcode installed with the cli tools. Also, you will need VS Code installed with the code command in your system path. | |
| xcode-select --install | |
| And, homebrew. | |
| /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" | |
| OpenSSL | |
| Install OpenSSL. | |
| brew install openssl | |
| MySQL | |
| Install MySQL. | |
| brew install mysql | |
| brew services start mysql | |
| brew services list | |
| Next, update your my.cnf | |
| code /usr/local/etc/my.cnf | |
| # Default Homebrew MySQL server config | |
| [mysqld] | |
| Only allow connections from localhost | |
| bind-address = 127.0.0.1 | |
| mysqlx-bind-address = 127.0.0.1 | |
| # Add mode only if needed | |
| sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" | |
| Now, secure using the password password and then restart. | |
| mysql_secure_installation | |
| brew services restart mysql | |
| Next, MySQL 8 authentication needs to be updated per user to mysql_native_password. | |
| mysql -u root -ppassword | |
| mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; | |
| Postgres | |
| Install postgresql (not the postgres app). | |
| brew install postgresql | |
| brew services start postgresql | |
| brew services list | |
| psql postgres | |
| Now, you can check your user list. | |
| postgres-# \du | |
| PHP | |
| Don’t use the default homebrew core tap for PHP. Use shivammathur/php. | |
| brew tap shivammathur/php | |
| brew install shivammathur/php/php@7.2 | |
| brew install shivammathur/php/php@7.3 | |
| brew install shivammathur/php/php@7.4 | |
| brew install shivammathur/php/php@8.0 | |
| Next, set PHP 7.4 as your default php CLI version. | |
| brew unlink php | |
| brew link --overwrite --force php@7.4 | |
| Now, for each version update the php-fpm you will need a unique port. Change the ports of each php-fpm to match its php version number. For example, php@7.4 I use port 9074. | |
| Also, you will want php-fpm to run with your user account and not _www. | |
| code /usr/local/etc/php/7.4/php-fpm.d/www.conf | |
| # default | |
| user = _www | |
| group = _www | |
| listen = 127.0.0.1:9000 | |
| # change to | |
| user = <your_username> | |
| group = staff | |
| listen = 127.0.0.1:9074 | |
| Optionally, before starting php-fpm, if you want to make edits to a php.ini file now is the time. For example, you might want to increase the upload_max_filesize and post_max_size to 10M. | |
| /usr/local/etc/php/7.2/php.ini | |
| /usr/local/etc/php/7.3/php.ini | |
| /usr/local/etc/php/7.4/php.ini | |
| /usr/local/etc/php/8.0/php.ini | |
| Once you are ready, start up php-fpm for each version. | |
| sudo brew services start php@7.2 | |
| sudo brew services start php@7.3 | |
| sudo brew services start php@7.4 | |
| sudo brew services start php@8.0 | |
| Check that you have processes running and validate your ports are correct. | |
| sudo lsof -i -n -P|grep php-fpm | |
| Next, and optionally, add some aliases for your CLI to use by adding the following and replacing <your_version> with the version homebrew installs. This will give you quick access to a specific version when needed. | |
| # Alias old versions | |
| alias php72="/usr/local/Cellar/php@7.2/<your_version>/bin/php" | |
| alias php73="/usr/local/Cellar/php@7.3/<your_version>/bin/php" | |
| alias php74="/usr/local/Cellar/php@7.4/<your_version>/bin/php" | |
| # The latest version of php in be located under | |
| # the "php" folder not an "@" folder. | |
| alias php80="/usr/local/Cellar/php/<your_version>/bin/php" | |
| # Make switching versions easy | |
| function phpv() { | |
| brew unlink php | |
| brew link --overwrite --force "php@$1" | |
| } | |
| If you want to change the default php CLI you can set it using brew or, if added, the bash function phpv 7.4. | |
| # brew | |
| brew unlink php | |
| brew link --overwrite --force php@7.4 | |
| # bash function | |
| phpv 7.4 | |
| PHP Errors | |
| As time passes Homebrew is bound to break your PHP installations. When this happens you can reinstall the PHP version having the error. Keep in mind you may need to reconfigure that version of PHP but I’ve found your php.ini files remain the same. | |
| brew reinstall shivammathur/php/php@7.4 | |
| Xdebug | |
| Now, I like xdebug for development. But, this step is optional. To install xdebug for each version of php (cli and fpm) run the following. | |
| brew link --overwrite --force php@7.2 | |
| pecl uninstall -r xdebug | |
| pecl install xdebug | |
| brew link --overwrite --force php@7.3 | |
| pecl uninstall -r xdebug | |
| pecl install xdebug | |
| brew link --overwrite --force php@7.4 | |
| pecl uninstall -r xdebug | |
| pecl install xdebug | |
| brew link --overwrite --force php@8.0 | |
| pecl uninstall -r xdebug | |
| pecl install xdebug | |
| For each version you installed update the php.ini. In our example, php@7.4. | |
| code /usr/local/etc/php/7.4/php.ini | |
| You will need to remove the zend_extension="xdebug.so" that is added to the top of the file by the pecl install process. The new default xdebug port is 9003, it was port 9000. | |
| Add the following to the bottom of your php.ini file. | |
| [xdebug] | |
| zend_extension="xdebug.so" | |
| xdebug.mode=debug | |
| xdebug.client_port=9003 | |
| xdebug.idekey=PHPSTORM | |
| When finished adding your xdebug configuration to each version you have installed kill all the currently running php-fpm processes. This is not wise to do on a production server. On a new Mac dev setup, this is perfectly fine. | |
| sudo killall php-fpm | |
| Nginx | |
| Install nginx. | |
| brew install nginx | |
| sudo nginx | |
| Now, test the install is working. | |
| http://localhost:8080 | |
| Now, change the default settings. | |
| code /usr/local/etc/nginx/nginx.conf | |
| # From | |
| listen 8080; | |
| server_name localhost; | |
| index index.html; | |
| # To | |
| listen 80; | |
| server_name localhost test.x; | |
| index index.html index.htm index.php; | |
| Next, add a FastCGI gateway to php-fpm on the default server. The latest version of php installed is best. For other servers, you can set the version of PHP to the project requirement. | |
| location ~ \.php$ { | |
| fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| include fastcgi_params; | |
| fastcgi_pass 127.0.0.1:9074; | |
| fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| } | |
| Next, add some basic security to your default server. | |
| add_header X-Frame-Options "SAMEORIGIN"; | |
| add_header X-XSS-Protection "1; mode=block"; | |
| add_header X-Content-Type-Options "nosniff"; | |
| Then add the charset. | |
| charset utf-8; | |
| Now, you might want to allow for large file uploads. | |
| http { | |
| ... | |
| client_max_body_size 100M; | |
| } | |
| Next, we edit the real index.html file used by nginx. So, replace the index.html with an index.php file. Then, and some php code to make sure everything is working. | |
| mv /usr/local/var/www/index.html /usr/local/var/www/index.php | |
| code /usr/local/var/www/index.php | |
| <?php echo phpinfo(); ?> | |
| Reload nginx. | |
| sudo nginx -s reload | |
| http://localhost | |
| To add more servers you can go to the nginx servers directory, /usr/local/etc/nginx/servers, and add them there as individual files. Here is a basic template. | |
| server { | |
| listen 443 ssl http2; | |
| listen [::]:443 ssl http2; | |
| ssl_certificate /usr/local/etc/nginx/ssl/{{host}}.crt; | |
| ssl_certificate_key /usr/local/etc/nginx/ssl/{{host}}.key; | |
| ssl_ciphers HIGH:!aNULL:!MD5; | |
| # listen 80; | |
| server_name {{host}}; | |
| root {{root}}; | |
| add_header X-Frame-Options "SAMEORIGIN"; | |
| add_header X-XSS-Protection "1; mode=block"; | |
| add_header X-Content-Type-Options "nosniff"; | |
| index index.html index.htm index.php; | |
| charset utf-8; | |
| location = /favicon.ico { access_log off; log_not_found off; } | |
| location = /robots.txt { access_log off; log_not_found off; } | |
| access_log off; | |
| location / { | |
| try_files $uri $uri/ /index.php?$query_string; | |
| } | |
| error_page 404 /index.php; | |
| location ~ \.php$ { | |
| fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| fastcgi_pass 127.0.0.1:9074; | |
| fastcgi_index index.php; | |
| include fastcgi_params; | |
| } | |
| location ~ /\.(?!well-known).* { | |
| deny all; | |
| } | |
| } | |
| view rawnginx-server-template.conf hosted with ❤ by GitHub | |
| To add SSL for your nginx server check out this post. I use these bash functions to make the process faster. To add a server I use the command nginxcreate my.test.x but you might want to modify the files to match your setup. | |
| alias nginxreload="sudo nginx -s reload" | |
| alias nginxrestart="sudo nginx -s stop && sudo nginx" | |
| alias nginxservers="cd /usr/local/etc/nginx/servers" | |
| function nginxcreate() { | |
| wget https://gist.githubusercontent.com/kevindees/4e3508357ef46676f7635c545e4fd017/raw/f2c2f2716605e4b22a437058e2a7ebf5f8b775b9/nginx-server-template.conf -O /usr/local/etc/nginx/servers/$1.conf | |
| sed -i '' "s:{{host}}:$1:" /usr/local/etc/nginx/servers/$1.conf | |
| if [ "$2" ]; then | |
| sed -i '' "s:{{root}}:$2:" /usr/local/etc/nginx/servers/$1.conf | |
| else | |
| sed -i '' "s:{{root}}:$HOME/Sites/$1:" /usr/local/etc/nginx/servers/$1.conf | |
| fi | |
| nginxaddssl $1 | |
| nginxrestart | |
| code /usr/local/etc/nginx/servers/$1.conf | |
| } | |
| function nginxaddssl() { | |
| openssl req \ | |
| -x509 -sha256 -nodes -newkey rsa:2048 -days 3650 \ | |
| -subj "/CN=$1" \ | |
| -reqexts SAN \ | |
| -extensions SAN \ | |
| -config <(cat /System/Library/OpenSSL/openssl.cnf; printf "[SAN]\nsubjectAltName=DNS:$1") \ | |
| -keyout /usr/local/etc/nginx/ssl/$1.key \ | |
| -out /usr/local/etc/nginx/ssl/$1.crt | |
| sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /usr/local/etc/nginx/ssl/$1.crt | |
| } | |
| function nginxedit() { | |
| code /usr/local/etc/nginx/servers/$1 | |
| } | |
| function nginxlist() { | |
| ll /usr/local/etc/nginx/servers/ | |
| } | |
| Dnsmasq | |
| To save yourself the fuss of editing your hosts file constantly you can use dnsmasq. | |
| brew install dnsmasq | |
| Then we set up a custom hosts TLD *.x (or other hosts TLD like .test) that point to 127.0.0.1. | |
| (customize the commands as needed) | |
| echo 'address=/.x/127.0.0.1' > /usr/local/etc/dnsmasq.conf | |
| sudo brew services start dnsmasq | |
| sudo mkdir -v /etc/resolver sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/x' | |
| Test that it is working. | |
| ping test.x | |
| MailHog | |
| I like to have mailhog running as a development mail server. But, if you don’t want to take this step that is perfectly fine. | |
| brew install mailhog | |
| brew services start mailhog | |
| # start with | |
| mailhog | |
| Now, you can access MailHog at http://localhost:8025/. However, you still need to connect MailHog to PHP and the mail mac command used by Postfix (Postfix comes with macOS Big Sur). | |
| code /etc/postfix/main.cf | |
| Add the following to the end of the file to connect MailHog to Postfix. | |
| # MailHog | |
| myhostname = localhost | |
| relayhost = [127.0.0.1]:1025 | |
| Send a test email and check MailHog. | |
| echo "Test email from Postfix" | mail -s "Test Email" hi@example.com | |
| Next, update each php.ini file with the following and then restart php-fpm. Note, test@localhost should be used but will be overridden by any PHP scripts that run. | |
| # Update your version number as needed | |
| # 1.0.1 as of this writing | |
| sendmail_path = /usr/local/Cellar/mailhog/1.0.1/bin/MailHog sendmail test@localhost | |
| sudo killall php-fpm | |
| Redis | |
| Install Radis. This will install Redis Server v6. | |
| brew install redis | |
| brew services start redis | |
| redis-server | |
| Optionally, you can update your default dump.rdb file name in the redis.conf if you want. | |
| code /usr/local/etc/redis.conf | |
| # The filename where to dump the DB | |
| dbfilename dump.rdb |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment