๐บ ์ฐ๋ฆฌ๋ ์์์ nginx 2๊ฐ๋ฅผ ์ค์นํด ๋ณด์์ต๋๋ค. ์ด์ ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก nginx + php + mysql + phpmyadmin ์ ๋ ์ค์นํ ๊ฒ์ ๋๋ค.
์ nginx ๋ฅผ ์ด๋ ๊ฒ ๋ง์ด ์ค์นํ๋๊ณ ์?
์์ผ๋ก ์ฐ๋ฆฌ๋ nginx์ Reverse-Proxy ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ, ๋ถํ ๋ถ์ฐ์ ์ํ ๋ก๋ ๋ฐธ๋ฐ์ฑ๋ ๊ตฌํํด ๋ณผ ๊ฒ์ ๋๋ค. (์? ๊ทธ๋ฅ ๊ณต๋ถ๋ฅผ ์ํด์...)
1. ํด๋ ์ ๋ฆฌ
๊ฐ. www ํด๋๋ฅผ ๋ง๋ ํ, ์ด์ ์ ๋ง๋ data, data2 ํด๋๋ฅผ www ํด๋ ๋ฐ์ผ๋ก ์ฎ๊ฒจ์ค๋๋ค.
๋. ๊ทธ๋ฆฌ๊ณ www ํด๋ ๋ฐ์ data3 ํด๋๋ ๋ง๋ค์ด ์ค๋๋ค.
๋ค. data3 ํด๋ ์์ index.php ํ์ผ์ ํ๋ ์์ฑํ ํ ์๋์ ๊ฐ์ด ์ ๋ ฅํด ์ค๋๋ค. (์๋ ์ ๋ ฅํ๋ ๊ฐ๋ค์ ๋ณธ ๊ฒ์๊ธ ํ๋จ์์ ๋ชจ๋ ์ ๋ ฅํ๋ ๋ด์ฉ๋ค์ ๋๋ค. ์ฐ์ ๋ฏธ๋ฆฌ ์ ๋ ฅํ์ธ์.)
<?php $connect = new mysqli('mysql_serv', 'root', 'password', 'testdb', '3306', 'UTF8'); $query = "select * from testtable"; $result = $connect->query($query) or die($this->_connect->error); foreach($result as $row){ print_r($row); echo '<br>'; } $connect->close(); phpinfo(); ?>

๋ผ. ์์์ ํด๋์ ์์น๋ฅผ ๋ฐ๊พธ์๊ธฐ ๋๋ฌธ์ docker-compose.yml ๋ด์ฉ์ ์์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. ๋ํ, ๋๋ฒ์งธ nginx(web2)์ ํฌํธ๋ฅผ 81๋ฒ์ผ๋ก ์์ ํด ์ฃผ์์ต๋๋ค.

2. ์ต์์์ docker ํด๋ ์์ฑ
(ํด๋ ์ด๋ฆ ๋ฐ ๋ฐฐ์น ๋ฑ์ ๊ฐ์ธ์ ์ทจํฅ์ ๋๋ค.)
๊ฐ. ๊ทธ ํ์์ conf, mysql, php ํด๋๋ฅผ ์์ฑํฉ๋๋ค.
๋. mysql ํด๋ ๋ฐ์ conf ํด๋๋ ํ๋ ์์ฑํด ์ค๋๋ค.

3. ํ์ํ ํ์ผ๋ค ์์ฑ
๊ฐ. docker>conf ํด๋ ์์ default.conf ํ์ผ ์์ฑ ํ ์๋ ๋ด์ฉ ์ ๋ ฅ
๐บ ์ด ๋ถ๋ถ์ ์๋ก ์์ฑํ๋ 3๋ฒ์งธ nginx ์น์๋ฒ์ root ๋๋ ํ ๋ฆฌ ๋ณ๊ฒฝ, php ํ์ผ ์คํ์ ์ํ ์ค์ ๋ฑ์ ํด์ฃผ๋ ๊ฒ์.
server { listen 80; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; index index.php index.html; root /var/www; #docker-compose.yml ์์ ๋ณผ๋ฅจ์ผ๋ก ์ง์ ํ ๊ฒฝ๋ก์ ๋๊ฐ์์ผ ํจ. location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php_serv:9000; #php_serv:9000์ docker-compose.yml ์์ php ์ปจํ
์ด๋ ์๋น์ค๋ช
, ํฌํธ๋ฅผ ์
๋ ฅํด์ผ ํจ. fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
๋. docker>mysql>conf ํด๋ ์์ my.cnf ํ์ผ ์์ฑ ํ ์๋ ๋ด์ฉ ์ ๋ ฅ
๐บ ์ด ๋ถ๋ถ์ DB์ ํ๊ธ ์ ๋ ฅ์ ์ํ ์ค์ ์ ํด์ฃผ๋ ๋ถ๋ถ์ ๋๋ค.
[client] default-character-set = utf8mb4 [mysqld] init-connect = 'SET collation_connection = utf8mb4_unicode_ci' init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci default_time_zone='+09:00' [mysql] default-character-set = utf8mb4 [mysqldump] default-character-set = utf8mb4
๋ค. docker>mysql ํด๋ ์์ init_db.sql ํ์ผ ์์ฑ ํ ์๋ ๋ด์ฉ ์ ๋ ฅ
๐บ ์ด ๋ถ๋ถ์ DB ์ปจํ ์ด๋๋ฅผ ์ฒ์ ์์ฑํ ๋ ์ด๊ธฐ ํ ์ด๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ ๋ ฅ์ ํด์ฃผ๋ ๋ถ๋ถ์ ๋๋ค. ์ด ์ด๊ธฐ๊ฐ์ด ํ์์๋ค๋ฉด ๋ฐ๋ก ํ์ผ ์์ฒด๋ฅผ ์์ฑํ์ง ์์๋ ๋ฉ๋๋ค.
DROP TABLE IF EXISTS `testtable`; CREATE TABLE `testtable` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `age` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `testtable` (name, age) VALUES ('hong kil dong',13),('mmssam',25); INSERT INTO `testtable` (name, age) VALUES ('๋ฉ๋ฉ์ค',13);
๋ผ. docker>php ํด๋ ์์ Dockerfile ํ์ผ ์์ฑ ํ ์๋ ๋ด์ฉ ์ ๋ ฅ
FROM php:8.1-fpm RUN apt-get update RUN docker-php-ext-install pdo pdo_mysql mysqli
โจ ์ฐธ๊ณ ์ค๋ช
์๋ docker-compose.yml ํ์ผ ๋ด์์ ์๋์ ๊ฐ์ด ํ ์๋ ์์ต๋๋ค.
php: container_name: php image: php:8.1-fpm
ํ์ง๋ง, php:8.1-fpm ์ด๋ฏธ์ง๋ก ๋ง๋ ์ปจํ ์ด๋์๋ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ช๊ฐ์ง ๋ชจ๋๋ค์ด ์ค์น๋์ด ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์, ์ Dockerfile์ ์ด์ฉํ์ฌ php:8.1-fpm ์ด๋ฏธ์ง๋ฅผ ๋จผ์ ๋ค์ด๋ก๋ ํ ํ์ํ ๋ช๊ฐ์ง ๋ชจ๋๋ค์ ์ถ๊ฐ์ํจ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ค์ ์์ฑํ ํ, ์ด๊ฒ์ docker-compose.yml ํ์ผ์์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋์ ๋ด์ฉ์ ./docker/php ํด๋ ์์ ์๋ Dockerfile์ ์ด์ฉํ์ฌ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ๊ทธ๊ฒ์ ์ด์ฉํด ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค๋ ๋ป์ ๋๋ค.
php_serv: container_name: php_cname build: context: ./docker/php dockerfile: Dockerfile
4. docker-compose.yml ์์
version: '3.9' networks: mungnet: driver: bridge mungnet_two: #๋๋ค๋ฅธ ๋คํธ์ํฌ ๋ธ๋ฆฌ์ง๋ฅผ ์์ฑ driver: bridge #์ ๋คํธ์ํฌ์ ์์ดํผ ๋์ญ์ด ๋ฌ๋ผ ์๋ก ์ฐ๊ฒฐ์ด ์๋จ. services: web: image: nginx container_name: nginx_cname restart: unless-stopped volumes: - ./www/data:/usr/share/nginx/html #๊ฒฝ๋ก ์์ ./data => ./www/data ports: - "80:80" networks: - mungnet web2: image: nginx container_name: nginx_cname2 restart: unless-stopped volumes: - ./www/data2:/usr/share/nginx/html #๊ฒฝ๋ก ์์ ./data2 => ./www/data2 ports: - "81:80" #ํฌํธ๋ฅผ 8080์์ 81๋ก ๋ณ๊ฒฝํ์์. networks: - mungnet web3: image: nginx:1.23.2 #nginx ํน์ ๋ฒ์ ์ค์น(์? ์ฐ์ตํด ๋ณด๋ ค๊ณ ...) container_name: nginx_cname3 #์ปจํ
์ด๋ ์ด๋ฆ ๋ณ๊ฒฝ restart: unless-stopped volumes: #- ./data3:/usr/share/nginx/html #๊ธฐ๋ณธ ํ ๊ฒฝ๋ก๋ฅผ ์์ ๋ค๋ฅด๊ฒ ์๋์ ๊ฐ์ด - ./www/data3:/var/www #/var/www๋ก ๋ณ๊ฒฝ(์? ๊ทธ๋ฅ ๋จ๋ค์ด ๋ง์ด ์ฐ๋๊น) - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf #๊ธฐ๋ณธ ํ ๊ฒฝ๋ก ๋ณ๊ฒฝ ๋ฐ php ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด nginx์ conf ํ์ผ์ ์์ ํด ์ฃผ์ด์ผ ํจ. depends_on: #nginx ์ค์น ์ ๋จผ์ php, mysql ์ค์น ํ ๊ทธ๋ค์ nginx ์ค์นํ๋ผ๋ ์๋ฏธ - php_serv - mysql_serv ports: - "8080:80" #8080 ํฌํธ๋ฅผ ์ด์ฉํจ networks: - mungnet_two php_serv: container_name: php_cname build: context: ./docker/php dockerfile: Dockerfile restart: unless-stopped working_dir: /var/www volumes: - ./www/data3:/var/www #php๋ฅผ ์ด์ฉํ nginx์ ๋ณผ๋ฅจ๋ช
๊ณผ ๋์ผํด์ผ๋ง ํจ! expose: #expose๋ php ์ปจํ
์ด๋๋ ์ธ๋ถ์์ ์ง์ ์ ์ํ ์ผ์ด ์์ผ๋ - "9000" #์ธ๋ถ ํฌํธ์ ์ฐ๊ฒฐํ ํ์๊ฐ ์๊ณ ๋ด๋ถ ํฌํธ๋ง ์ง์ ํ ๋ ์ฌ์ฉ networks: - mungnet_two mysql_serv: image: mysql:latest container_name: mysql_cname restart: unless-stopped #ports: #์ธ๋ถ์์์ ์ ์์ด ํ์ํ๋ฉด ports ๋ฅผ ์ด์ฉํจ # - "3306:3306" expose: - "3306" #์ธ๋ถ์์๋ ์ ์ ๋ถ๊ฐ, ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ volumes: - ./docker/mysql/conf:/etc/mysql/conf.d - ./docker/mysql:/docker-entrypoint-initdb.d - ./../mysql_data/mysql:/var/lib/mysql environment: MYSQL_DATABASE: testdb MYSQL_ROOT_PASSWORD: password MYSQL_PASSWORD: password MYSQL_USER: mungkhs SERVICE_TAGS: mysql_servicetags SERVICE_NAME: mysql_servicename TZ: Asia/Seoul command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci networks: - mungnet_two #์ web, web2 ์๋น์ค์ ๋คํธ์ํฌ๊ฐ ๋ฌ๋ผ web,web2์์๋ mysql ์ ์ ๋ถ๊ฐ mung_phpmyadmin: image: phpmyadmin:latest container_name: phpmyadmin_cname environment: PMA_HOST: mysql PMA_PORT: 3306 PMA_ARBITRARY: 1 restart: always ports: - "8888:80" depends_on: - mysql_serv networks: - mungnet_two
โจ ์์์ ๋คํธ์ํฌ ์ ์ ๋ถ๋ถ์ ๋ณด๋ฉด 2๊ฐ๋ก ๋์ด ์์ต๋๋ค. ์ด 2๊ฐ์ ๋คํธ์ํฌ๋ ์๋ก ๋ค๋ฅธ ๋์ญ์ ์์ดํผ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ก ์๋๋ฐฉ์ ์ ์์ด ๋ถ๊ฐํฉ๋๋ค. ์์์๋ ์ฒ์ ๋ง๋ 2๊ฐ์ nginx ์๋ฒ๋ mungnet ๋ธ๋ฆฌ์ง์, ์ดํ ๋ง๋ nginx, php, mysql, phpmyadmin์ mungnet_two ๋ธ๋ฆฌ์ง์ ์ฐ๊ฒฐ์ ํด๋ณด์์ต๋๋ค. (์? ๊ทธ๋ฅ ์ฐ์ตํ๋ ค๊ณ ....)
networks: mungnet: driver: bridge mungnet_two: #๋๋ค๋ฅธ ๋คํธ์ํฌ ๋ธ๋ฆฌ์ง๋ฅผ ์์ฑ driver: bridge #์ ๋คํธ์ํฌ์ ์์ดํผ ๋์ญ์ด ๋ฌ๋ผ ์๋ก ์ฐ๊ฒฐ์ด ์๋จ.



5. git push ํ ์๋ฒ์์ ํ์ธ
๊ฐ. ์ฒ์ 2๊ฐ์ nginx ์๋ฒ ์ ์ ํ๋ฉด

๋. ์๋ก ์ค์นํ 3๋ฒ์งธ nginx ์๋ฒ ์ ์ ํ๋ฉด
์ฒซ ๋ถ๋ถ์ DB์ ๋ค์ด์๋ ๋ด์ฉ์ ์ ๋ถ๋ฌ์์ ๋ณด์ฌ์ฃผ๊ณ ์์ผ๋ฉฐ, ๊ทธ ๋ค์ ๋ถ๋ถ์ phpinfo ๋ด์ฉ์ด ๋ณด์ฌ์ง๊ณ ์์.

๋ค. 8888 ํฌํธ๋ก ์ ์ํ๋ฉด phpmyadmin ํ๋ฉด์ ๋ณผ ์ ์์. (ํน์ ๋ณผ ์ ์๋ค๋ฉด ํด๋ผ์ฐ๋ ๋ฐฉํ๋ฒฝ์์ 8888 ํฌํธ ํด์ )

๋ก๊ทธ์ธ ํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์์.

๐บ๐บ ์์ ํ ๋ชจ๋ ์์ค๋ ์๋ ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ๐บ๐บ
https://github.com/mmssem/progstudy
GitHub - mmssem/progstudy
Contribute to mmssem/progstudy development by creating an account on GitHub.
github.com
๐บ ๋ชฉ์ฐจ ๐บ(๋ณด์๋ ค๋ฉด ์๋ ๋๋ณด๊ธฐ ๋ฅผ ๋๋ฌ์ฃผ์ธ์.)
1. Docker๋ฅผ ์ฌ๋ํ๊ฒ ๋ ์ด์ (Docker+Nginx_proxy+SSL+Github action)
2. Docker ์ค์น (Docker+Nginx_proxy+SSL+Github action)
3. MobaXterm (Docker+Nginx_proxy+SSL+Github action)
5. ๋ก์ปฌ์ nginx(์น์๋ฒ) ์ค์นํด๋ณด๊ธฐ (Docker+Nginx_proxy+SSL+Github action)
6. ์๋ฒ ์๋ ๋ฐฐํฌ (1) ๋ก์ปฌ => github (Docker+Nginx_proxy+SSL+Github action)
7. ์๋ฒ ์๋ ๋ฐฐํฌ (2) ์๋ฒ์ ์๋ ๋ฐฐํฌ๋ฅผ ์ํ runner ์ค์น
8. ์๋ฒ ์๋ ๋ฐฐํฌ (3) ๋ก์ปฌ ์์ค -> git push -> github -> ์๋ฒ ์๋ ๋ฐฐํฌ ํ์ธ
9. (tip) git Add, Commit, push ํ๋ฒ์ ํ๊ธฐ
10. ์๋ฒ ์๋ ๋ฐฐํฌ (4) ๋ฐฐํฌ์ ์๋ฒ์์ docker-compose.yml ์๋ ์คํ
11. ์๋ฒ์ vnstat ์ค์น (docker-compose.yml ์ด์ฉ)
12. ์๋ฒ์ ๋์ปค ์ค์น์ network ์ค์ ๋ณ๊ฒฝ ์ฌํญ ํ์ธํ๊ธฐ
13. nginx + php + mysql + phpmyadmin ์ค์นํ๊ธฐ
14. Nginx - Reverse Proxy, Load Balancing ๊ธฐ๋ฅ ํ์ฉ
15. ๋ก์ปฌ์์ ์์ดํผ ๋์ ๋๋ฉ์ธ๋ช ์ฌ์ฉํ๊ธฐ(hosts ์์ )
16. https๋ฅผ ์ฐ๊ธฐ ์ํด ๋ก์ปฌ์์ SSL ํ ์คํธ ํ๊ธฐ (with mkcert)
17. ์๋ฒ์ SSL ์ ์ฉํ๊ธฐ (docker + Let's Encrypt + wildcard ์ธ์ฆ์ + Cloudflare)
18. ์์ผ๋์นด๋ ์ธ์ฆ์ ์๋ ๊ฐฑ์ (docker + Let's Encrypt + wildcard ์ธ์ฆ์ + crontab)