TechDogy

(paduvi)

You can do anything, but not everything..

Hướng dẫn cài đặt Nginx + MySQL + PHP (LEMP) trên Ubuntu 18

Categories:

Bài này dành cho ai đang cần deploy PHP mà k dùng Apache, thích dùng Nginx hơn cơ (như mình chẳng hạn). Blog này cũng đang sử dụng WordPress nên mình cũng note lại các bước để nhỡ đâu sau này chính mình lại cần tới nó 😀

1. Nginx

Nguồn tham khảo: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04

$ sudo apt update
$ sudo apt install nginx
$ sudo ufw allow 'Nginx Full'

Check cài đặt thành công chưa?

$ systemctl status nginx

Lúc này bạn có thể truy cập bằng trình duyệt tới đường dẫn IP của server tại port 80 (hoặc gõ tên domain nếu đã gắn domain), nó sẽ hiển thị trang landing page mặc định của Nginx.

Trang landing này nằm ở thư mục /var/www/html, bạn có thể edit lại source code html của nó tùy theo nhu cầu của mình 😀

2. MySQL

Cài đặt MySQL và tạo user root:

$ sudo apt install mysql-server
$ sudo mysql_secure_installation

Kiểm tra MySQL có chặn kết nối từ remote không nhé, nếu có thì mình thiết lập bỏ tính năng đó

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
# Xóa/Comment cái dòng bên trên lại nha
$ sudo service mysql restart
$ sudo ufw allow 3306/tcp

(Nếu bạn không dùng WordPress, hãy bỏ qua và chuyển sang bước 3)

$ mysql -u root -p

Nhập password của user root vừa tạo, sau đó tạo user và DB dành riêng cho WordPress:

mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> GRANT ALL ON wordpress.* TO 'wordpressuser'@'%' IDENTIFIED BY 'password';

3. PHP

$ sudo add-apt-repository universe
$ sudo apt install php-fpm php-mysql

Tích hợp PHP với Nginx:

$ sudo nano /etc/nginx/sites-available/example.com

Bạn có thể thay example.com bằng bất cứ tên nào mình tùy thích, tốt nhất là đặt theo domain hoặc tên của project, vì có thể sau này mình sẽ gặp trường hợp deploy nhiều project/domain trên cùng 1 máy.

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

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

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}
$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
$ sudo unlink /etc/nginx/sites-enabled/default

Test config và reload nếu không có lỗi:

$ sudo nginx -t
$ sudo systemctl reload nginx

Đến đây là đã kết thúc, mình chạy WordPress trên subdomain nên nếu bạn nào tham khảo cấu hình cho subdomain thì có thể xem bên dưới nha:

server {
    listen 80;

    gzip on;
    gzip_types application/javascript image/* text/css;
    gunzip on;

    root /var/www/techdogy.com/blog;
    index index.php;

    server_name blog.techpago.com www.blog.techpago.com;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }

}

Latest Comments:

  1. Mình đi search về storage engine thì thấy series về bài của bạn (mình đoán là bạn cũng đọc từ…

  2. Series rất hay, ủng hộ admin làm thêm về các database khác như Scylladb (discord mới migrate từ Cassandra sang)

  3. bài viết rất chất lượng, ủng hộ mạnh tác giả

  4. Mình đang làm về authentication thì phải tìm hiểu thêm về JWE (Json Web Encryption) và JWS (Json Web Signature).…

Leave a Reply

Your email address will not be published. Required fields are marked *