ubuntu18.04에서 nginx, php-fpm 연동

hyukim·2021년 7월 5일
2

PHP

목록 보기
1/1
post-thumbnail

윈도우에 wsl(ubuntu)를 설치하고 그 위에서 php를 쓰기 위해서 nginx위에 php-fpm을 얹어서 쓰게 됐다. nginx와 php-fpm을 연동하는 과정에서 겪은 어려움 및 내용을 정리했다.

명령어들이 Permission denied나 Operation not permitted 에러로 동작하지 않을 때는 sudo 권한으로 실행하면 된다. 관리자가 아니라면 유감...

1. 필요한 패키지들을 apt를 통해 다운

apt update && apt -y upgrade && \
apt -yq install \
nginx \
vim \
php7.2-fpm
mariadb-server \
php-mysql
  • nginx 설치 시 도커를 통한 자동화 등과 같이 region 설정과 같은 상호작용(interactive)를 하지 않기 위해서는 다음과 같은 환경 변수를 추가하면 된다. export DEBIAN_FRONTEND=nointeractive
  • apt에서
    - -q: --quiet. 로깅에 적합한 출력을 생성하고 진행률 표시기를 생략한다.
    - -y: --yes. 모든 질문을 표시하지 않고 yes로 답한다.

2. nginx 기본 파일들을 삭제하고 필요한 설정 파일을 넣기

rm /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
vi /etc/nginx/conf.d/default.conf
ln -s /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/
# default.conf
server {
	server_name _;

	listen 80 default_server;
	listen [::]:80 default_server;

	root /var/www/html;
	index index.html index.nginx-debian.html index.php;

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

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		include fastcgi_params;
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
}
  • nginx config 파일을 작성하면서 많이 헤맸다.
  • nginx와 php-fpm은 잘 동작하고 있는데, nginx에서 php파일을 서빙할 때 html로 인코딩된 결과를 못 보래는 문제를 겪었다. .php 파일 자체를 다운로드 시키거나 502 Bad Gateway nginx와 같은 에러를 냈다.
  • webserv 프로젝트를 하면서 웹서버의 동작 과정과 cgi와 어떻게 동작하는지 알게 돼서 문제를 추적하여 해결 할 수 있었다.
  • .php 파일을 그대로 주는 경우는 cgi 프로그램 즉, php-fpm을 서버에서 못 찾아서 생기는 문제이다. 그러므로 fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;으로 위치를 특정시켜줘서 해결하면 된다.
  • 502 Bad Gateway는 cgi는 찾았으나 cgi 프로그램 또는 그 설정이 문제가 있어서 발생하는 오류이다. 그러므로 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;을 작성해서 해결하면 된다. 위 설정을 쓰기 전에는 cgi의 변수들을 지정해주는 include fastcgi_params;를 꼭 작성해 줘야 한다.

3. nginx.conf의 설정값에 맞게 root 폴더의 owner와 권한 변경

chown -R www-data /var/www/*
chmod 755 /var/www/*

4. 설치한 서비스들 실행

service mysql start
service php7.2-fpm start
service nginx start

5. 테스트

root 폴더에 index.php를 추가하고, /etc/nginx/conf.d/default.conf의 index에 index.php를 추가해서 잘 동작하는지 테스트해보자.

/* /var/www/html/index.php */
<?php phpinfo(); >? /* php의 정보를 보여주는 페이지를 만드는 함수 호출 */
# /etc/nginx/conf.d/default.conf
server {
	...
	index index.php;
	...
}
service nginx reload
  • 결과


굿

github

profile
💪 🥩 🍺 ✈ 💻

0개의 댓글