Cài đặt Magento trên MacOS Monterey

 


Xin chào các bạn. Dạo gần đây mình bắt đầu chuyển qua dùng Macbook. Mọi thứ đều rất ổn vì các app hiện tại mình dùng đã Native trên chip M1. Vấn đề chỉ xảy ra cho tới khi mình cài Magento để phục vụ công việc hiện tại. Trong bài viết trước mình đã hướng dẫn các bạn cài Magento trên Docker và những lợi ích của nó mang lại. Tuy nhiên có vấn đề khi mình sử dụng Docker Desktop. Bản chất của con Docker Desktop ( Win & Mac) nó sẽ tạo một con máy ảo trong khi bạn sử dụng Linux nó sẽ sử dụng trực tiếp nhân linux trên máy thật. Từ đây xảy ra một vấn đề liên quan tới việc sync folder & file từ máy thật qua con Docker, đó là nó khá là chậm. Không chỉ riêng Magento mà các project khác cũng khá là chậm tuỳ thuộc vào độ lớn của project (Mà các bạn cũng biết Magento nó nặng cỡ nào rùi đấy 🥲).

Mình bắt đầu nghĩ là: "Cmn!! Xai nầm tủi chẻ rồi. Mua về không dùng được thì mua làm éo gì?" Sau 77 49 lần google các thể loại không ăn thua. Mình đã quyết định cài trực tiếp luôn trên Mac mà không phải qua Docker đốc củng gì cả. Có thể sẽ phát sinh một số lỗi nhỏ do không tương thích hệ điều hành (Magento recommended linux) nhưng nó ở trong tầm chấp nhận được. Ok chúng ta bắt đầu thôi

Các ứng dụng cần cài đặt

  • Homebrew & VSCode
  • MySQL
  • Multiple PHP & Xdebug (có thể switch PHP version qua Brew)
  • Nginx
  • DNSMASQ (cần có nếu bạn muốn tuỳ chỉnh domain)
  • Elasticsearch
  • Các app khác (Mailhog, Redis,..)
  • Cài đặt Brew & VSCODE
  • Cài đặt Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Nó sẽ yêu cầu bạn phải cài đặt và thực hiện một số task để có thể hoạt động. Các bạn cứ làm theo hướng dẫn là được

Tiếp theo chúng ta sẽ cài VSCode. Bạn có thể cài qua Homebrew hoặc download trực tiếp từ trang chủ

brew install --cask visual-studio-code

Bạn cũng cần chắc chắn rằng bạn đã thêm code vào System Path

MySQL

Cài đặt MySQL

brew install mysql
brew services start mysql
brew services ls

Tiếp theo chúng ta cần phải sửa lại một chút config cho MySQL

# Intel x86 Chipset
code /usr/local/etc/my.cnf

# Apple Silicon M1 Chipset
code /opt/homebrew/etc/my.cnf

File 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"

# Set Default Charset
character-set-server=utf8
collation-server=utf8_general_ci

Setup Password cho MySQL

sudo mysql -uroot
mysql> mysql_secure_installation
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR_PASSWOR_IN_HERE';
mysql> exit;
brew services restart mysql

Cài đặt Multiple PHP Version

brew install php@7.3
brew install php@7.4
brew install php@80

Các bạn cũng có thể tìm các phiên bản PHP có thể cài bằng brew qua lệnh

brew search php@

Có thể switch qua lại các phiên bản PHP bằng

brew unlink php
brew link --overwrite --force PHP_VERSION

Sử dụng php7.4 làm mặc định

brew unlink php
brew link --overwrite --force php@7.4

Bây giờ ở mỗi phiên bản PHP bạn cần sử dụng một port khác nhau. Vì các PHP-FPM đang dùng chung 1 port 9000. VD: với phiên bản PHP 7.4 mình sẽ sử dụng port 9074. Và PHP-FPM cần sử dụng user của bạn chứ không phải _www

# Apple Silicon M1 Chipset
code /opt/homebrew/etc/php/7.4/php-fpm.d/www.conf

# Intel x86 Chipset
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

Trước khi khởi động lại PHP-FPM bạn cần sửa lại một chút file php.ini. VD bạn muốn tăng upload_max_filesize và post_max_size thành 128MBmemory_limit = 8G cho nó xông xênh

# Apple Silicon M1 Chipset
code /opt/homebrew/etc/php/7.4/php.ini

# Intel x86 Chipset
code /usr/local/etc/php/7.4/php.ini

Vậy là xong. Bây giờ bạn cần phải khởi động lại PHP-FPM để nó nhận config mới

brew services restart php@7.4

Kiểm tra lại xem PHP-FPM đã nhận đúng config chưa

sudo lsof -i -n -P|grep php-fpm

Cài đặt Xdebug

Trong quá trình code việc debug là điều không thể tránh khỏi. Vì thế chúng ta cần phải cài thêm extension để tiện cho việc debug.

brew unlink php
brew link --overwrite --force php@7.4
pecl install xdebug

Chúng ta cần phải config Xdebug để nó có thể hoạt động. Mở lại file php.ini xoá đoạn zend_extension="xdebug.so" và thay bằng config sau

[xdebug]
zend_extension="xdebug.so"
xdebug.mode=debug
xdebug.client_port=9003
xdebug.idekey=PHPSTORM

Ở phiên bản Xdebug 3 xdebug sử dụng port 9003 thay vì 9000 như trước

Sau khi thêm Xdebug xong bạn cần phải khởi động lại PHP để nó nhận Xdebug và config

brew services restart php@7.4

Nginx

Cài đặt Nginx

brew install nginx
sudo nginx

Bạn có thể truy cập đường dẫn để xem nginx đã hoạt động chưa

http://localhost:8080

Bây giờ chúng ta cần phải thay đổi config mặc định cho nginx

# Apple Silicon M1 Chipset
code /opt/homebrew/etc/nginx/nginx.conf

# Intel x86 Chipset
code /usr/local/etc/nginx/nginx.conf

File nginx.conf

user <your_username> staff;
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type text/html;
    gzip on;
    gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;

    sendfile on;
    keepalive_timeout 65;

    charset utf-8;

    server_names_hash_bucket_size 512;
    client_max_body_size 100M;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    server {
        listen 80;
        server_name localhost, test.test;
        root <your_document_root>;

        proxy_intercept_errors on;
        fastcgi_intercept_errors on;

        location / {
            autoindex on;
            index index.html index.php;
            proxy_buffer_size 128k;
            proxy_buffers 4 256k;
            proxy_busy_buffers_size 256k;
        }

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {
            root html;
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9074;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

    include servers/*;
}

Tạo file index.php trong folder root của bạn thiết lập ở trên

<?php echo phpinfo(); ?>

Khởi động lại nginx

sudo nginx -s reload
http://localhost

Để thêm nhiều servers hơn các bạn có thể thêm config trong folder /opt/homebrew/etc/nginx/servers/ với chip M1 và /usr/local/etc/nginx/servers với chip Intel

DNSMASQ

Để tránh việc phải thay đổi liên tục file hosts của bạn có thể gây ảnh hưởng tới cả máy. Bạn cần cài đặt thêm dnsmasq.

brew install dnsmasq

Sau đó chúng ta cần setup TLD *.test trỏ vào địa chỉ 127.0.0.1 trên máy

# Apple Silicon M1 Chipset
echo 'address=/.test/127.0.0.1' > /opt/homebrew/etc/dnsmasq.conf

# Intel x86 Chipset
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/test'

Kiểm tra lại xem đã ok chưa

ping test.test

Elasticsearch

Cài đặt Elasticsearch

brew install elasticsearch@6
brew services start elasticsearch
ping 127.0.0.1:9200

Vậy là ok. Bây giờ chúng ta có thể download Magento về và cài đặt. Các bước cài đặt Magento các bạn có thể lên docs của Magento và làm theo hướng dẫn.

Config nginx cho Magento

# Apple Silicon M1 Chipset
code /opt/homebrew/etc/nginx/servers/magento.test.conf

# Intel x86 Chipset
code /usr/local/etc/nginx/servers/magento.test.conf
server {
    listen 80;
    server_name magento.test;
    index index.html index.htm index.php;

    set $MAGE_ROOT <your_document_magento_root>;
    set $MAGE_DEBUG_SHOW_ARGS 1;

    include <your_document_magento_root>/nginx.conf.sample;

}

upstream fastcgi_backend {
    server 127.0.0.1:9074;
}