Arch Linux에서 "Nginx 웹 서버"를 사용하여 가상 호스트, 비밀번호 보호 디렉토리 및 SSL 인증서 생성
이전 Arch Linux 'LEMP' 기사에서는 네트워크 서비스(Nginx, MySQL 데이터베이스 및 PhpMyAdmin) 설치부터 MySQL 서버 및 PhpMyadmin에 필요한 최소한의 보안 구성까지 기본적인 내용을 다루었습니다.
이 주제는 이전 Arch Linux에 LEMP를 설치하는 것과 엄격하게 관련되어 있으며 LEMP 스택에 대한 보다 복잡한 구성, 특히 가상 호스트 생성과 같은 Nginx 웹 서버 구성을 설정하는 방법을 안내합니다. , 비밀번호로 보호된 디렉터리를 사용하고, HTTP 보안 소켓 레이어를 생성 및 구성하고, HTTP 비보안을 HTTPS로 리디렉션하고, 다음과 같은 몇 가지 유용한 Bash 스크립트도 제공합니다. 가상 호스트 활성화 작업을 쉽게 하고 SSL 인증서 및 키를 생성합니다.
요구사항
Arch Linux에 MariaDB 데이터베이스와 함께 LEMP 설치
1단계: Nginx에서 가상 호스트 활성화
가상 호스트를 활성화하는 가장 간단한 방법 중 하나는 기본 Nginx 구성 파일에 include 문을 사용하는 것입니다. 이렇게 하면 간단한 파일을 만들 수 있으므로 추가 구성 작업이 더 간단하고 효율적이 됩니다. 모든 새 호스트에 대해 기본 구성 파일을 깨끗하게 유지하십시오.
이 접근 방식은 Apache 웹 서버와 동일한 방식으로 작동합니다. 가장 먼저 해야 할 일은 Nginx가 파일 지시어를 읽어야 하는 새로운 URI 경로를 지정하는 것입니다.
1. 따라서 /etc/nginx/ 시스템 경로와 하단의 마지막 중괄호 " 앞에 있는 nginx.conf 기본 파일을 엽니다. }”는 향후 가상 호스트 구성 파일이 상주할 경로를 추가합니다.
sudo nano /etc/nginx/nginx.conf
맨 아래에 다음 문을 추가합니다.
include /etc/nginx/sites-enabled/*.conf;
이 지시문은 Nginx에게 .conf 확장자로 끝나는 /etc/nginx/sites-enabled/에 있는 모든 파일을 읽어야 한다고 지시합니다.
2. 다음 단계는 sites-enabled 디렉토리와 모든 가상 호스트 구성을 저장하는 sites-available 디렉토리를 만드는 것입니다. 파일.
sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
3. 이제 새로운 가상 호스트를 생성할 차례입니다. 이 예에서는 시스템 IP 주소를 가상 호스트 이름으로 사용하므로 name-ip.conf라는 새 파일을 만듭니다.
sudo nano /etc/nginx/sites-available/name-ip.conf
다음 내용을 추가하세요.
## File content ##
server {
listen 80;
server_name 192.168.1.33;
access_log /var/log/nginx/192.168.1.33.access.log;
error_log /var/log/nginx/192.168.1.33.error.log;
root /srv/http;
location / {
index index.html index.htm index.php;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
가상 호스트를 활성화하는 지시문은 수신 포트 아래의 server_name 문입니다. 또한 여기서 또 다른 중요한 지시문은 Nginx 가상 호스트가 /srv/http/ 시스템 경로의 파일 콘텐츠를 제공하도록 지시하는 root 문입니다.
4. 마지막 단계는 /srv/http/ 디렉토리를 생성하고 name-ip.conf 파일 구성을 Nginx 읽기에 사용할 수 있도록 만드는 것입니다(사용 심볼릭 링크) 그런 다음 데몬을 다시 시작하여 새 구성을 표시합니다.
sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
5. 이를 확인하려면 브라우저에서 Arch 시스템 IP 주소를 지정하면 웹 콘텐츠가 http://localhost와 다른지 확인해야 합니다. 여기에 아래 스크린샷과 같이 FastCGI PHP 구성도 확인하는 작은 PHP 스크립트를 추가했습니다.
sudo nano /srv/http/info.php
## File content ##
<?php
phpinfo();
?>
6. Nginx에서 가상 호스트를 활성화하거나 비활성화하기 위해 제가 직접 개발한 또 다른 방법은 더 우아한 방법이며 Apache a2eniste 스크립트에서 영감을 얻었습니다.
이 방법을 사용하려면 파일 편집기를 열고 아래 내용이 포함된 $HOME 경로에 n2ensite라는 새 파일을 생성하고 실행 가능하게 만든 후 루트 권한으로 실행하세요. .conf로 끝나지 않고 새 가상 호스트 이름에 옵션으로 전달합니다(필요에 따라 자유롭게 수정하세요).
sudo nano n2ensite
## File content ##
#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi
avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`
if [ "$#" != "1" ]; then
echo "Use script: n2ensite virtual_site"
echo -e "\nAvailable virtual hosts:\n$site"
exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi
실행 가능하게 만들고 show로 실행하십시오.
sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host
7. 가상 호스트를 비활성화하려면 다음 내용으로 새 n2dissite 파일을 만들고 위와 동일한 설정을 적용하십시오.
sudo nano n2dissite
## File content ##
#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`
if [ "$#" != "1" ]; then
echo "Use script: n2dissite virtual_site"
echo -e "\nAvailable virtual hosts: \n$site"
exit 0
else
if test -e $avail; then
sudo rm $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi
8. 이제 이 두 스크립트를 사용하여 가상 호스트를 활성화하거나 비활성화할 수 있지만 시스템 전체 명령으로 적용하려면 두 스크립트를 모두 /usr/local/bin/<에 복사하세요. 경로를 지정하지 않고 사용하시면 됩니다.
sudo cp n2ensite n2dissite /usr/local/bin/
2단계: Nginx에서 가상 호스트로 SSL 활성화
SSL(보안 소켓 계층)은 네트워크나 인터넷을 통한 HTTP 연결을 암호화하도록 설계된 프로토콜로, 대칭/비대칭 암호화 키를 사용하여 보안 채널을 통해 데이터 흐름이 전송되도록 합니다. OpenSSL 패키지를 통해 Arch Linux에서 제공됩니다.
sudo pacman -S openssl
9. Nginx로 HTTPS 연결을 활성화하려면 가장 먼저 해야 할 일은 가상 호스트 키를 생성하는 것입니다. 또한 작업을 단순화하기 위해 가상 호스트 이름을 키 이름으로 사용하여 /etc/nginx/ssl 디렉터리 경로에 암호화 키를 자동으로 생성하는 작은 스크립트를 개발했습니다.
nginx_gen_ssl이라는 파일을 만들고 다음 내용을 추가합니다.
sudo nano nginx_gen_ssl
## File content ##
#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx SSL certificate!"
read cert
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt
echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0
10. 스크립트가 생성된 후 실행 권한을 추가하고 이를 실행하고 인증서 옵션을 제공합니다. 가장 중요한 것은 일반 이름 필드(여기에 공식 도메인 이름을 추가하세요) 및 비밀번호 및 선택적 회사 필드를 비워 두세요.
sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl
키 생성 작업이 끝나면 Nginx SSL 디렉터리 아래에 사용 가능한 모든 키가 포함된 목록이 표시됩니다.
또한 이 스크립트를 시스템 명령으로 사용하려면 /usr/local/bin/으로 복사하거나 이동하세요.
sudo mv nginx_gen_ssl /usr/local/bin
11. Nginx SSL 가상 호스트에 필요한 키를 생성한 후에는 실제로 SSL 가상 호스트 구성 파일을 생성할 차례입니다. server_name 지시문에서 위와 동일한 가상 호스트에 대해 동일한 시스템 IP 주소를 사용하지만 .conf 앞에 ssl을 추가하여 가상 호스트 파일 이름을 약간 변경하여 이 파일이 name-ip SSL 가상 호스트를 나타냅니다.
sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf
이 파일에서 listen 포트 설명을 443 ssl로 변경하고 SSL 및 인증서 키 파일 경로를 아래 발췌와 같이 이전에 생성된 경로와 함께 제공합니다.
## File content ##
server {
listen 443 ssl;
server_name 192.168.1.33;
ssl_certificate /etc/nginx/ssl/192.168.1.33.crt;
ssl_certificate_key /etc/nginx/ssl/192.168.1.33.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/192.168.1.33-ssl.access.log;
error_log /var/log/nginx/192.168.1.33-ssl.error.log;
root /srv/http;
location / {
index index.html index.htm index.php;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
12. 파일이 생성된 후 n2ensite 스크립트 또는 ln 명령줄을 사용하여 활성화합니다(사이트에 파일 심볼릭 링크 생성). -enabled 디렉터리) 그런 다음 Nginx 데몬을 다시 시작하여 설정을 적용합니다.
sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
13. 다시 브라우저에서 아치 IP URL을 지정하지만 이번에는 내 시스템에서 HTTPS 프로토콜(https://192.168.1.33)을 사용합니다. 신뢰할 수 없는 연결 보안 오류가 나타나야 합니다(페이지에서 더 자세히 알아보려면 보안 예외 추가 및 확인).
이제 볼 수 있듯이 Nginx 가상 호스트는 이전 name-ip 호스트와 동일한 콘텐츠를 제공하지만 이번에는 HTTP 보안 연결을 사용합니다.
3단계: 가상 호스트를 통해 PhpMyAdmin에 액세스
Nginx에서 가상 호스트가 활성화된 경우 더 이상 http://localhost 경로 콘텐츠에 액세스할 수 없습니다(localhost는 일반적으로 달리 구성되지 않은 경우 루프백 IP 주소 또는 시스템 IP 주소를 사용하여 콘텐츠를 제공합니다). Arch 시스템 IP를 server_name으로 사용하여 콘텐츠 경로가 변경되었습니다.
14. 웹을 통해 PhpMyAdmin에 액세스하는 가장 간단한 방법은 /usr/share/webapps/phpMyAdmin/ 경로 사이에 심볼릭 링크를 만드는 것입니다. 그리고 새로 정의된 가상 호스트 경로(/srv/http).
sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/
15. 위 명령을 실행한 후 페이지를 새로 고치면 Nginx 가상 호스트에서 autoindex 문이 활성화되어 있거나 URL을 직접 가리키는 경우 새 폴더 phpMyAdmin이 나타나는 것을 볼 수 있습니다. PhpMyAdmin 폴더 https://arch_IP/phpMyAdmin.
16. 브라우저에서 phpMyAdmin 문자열을 삭제하려면 가상 호스트 파일을 편집하고 서버 블록 아래에 다음 콘텐츠를 추가하세요.
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
4단계: Nginx에서 비밀번호로 보호된 디렉터리 활성화
Apache와 달리 Nginx는 HttpAuthBasic 모듈을 사용하여 비밀번호로 보호된 디렉터리를 활성화하지만 암호화된 .htpasswd 파일을 생성하는 도구를 제공하지 않습니다.
17. Arch Linux에서 Nginx로 디렉토리 비밀번호를 보호하려면 Apache 웹 서버를 설치하고 해당 도구를 사용하여 암호화된 .htaccess 파일을 생성하세요.
sudo pacman -S apache
18. Apache를 설치한 후 /etc/nginx/ 아래에 직관적으로 passwd라는 이름의 새 디렉토리를 만듭니다. 여기에 .htpasswd 파일이 저장되고 사용됩니다. htpasswd 명령과 –c 스위치를 먼저 추가한 사용자에 설정하여 파일을 생성한 다음 더 많은 사용자를 추가하려면 – 없이 htpasswd를 사용하세요. c 스위치.
sudo mkdir /etc/nginx/passwd
sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user
19. name-ip-ssl 가상 호스트 루트 /srv/http/ 제공 경로를 모든 하위 폴더 및 파일과 함께 보호하기 위해 루트 지시문 아래의 가상 호스트 서버 블록 내에 다음 지침을 추가하고 절대 .htpasswd 파일 경로를 가리킵니다.
auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;
20. Nginx 서비스를 다시 시작한 후 페이지를 새로 고치고 자격 증명을 요구하는 인증 필요 팝업이 나타납니다.
이제 Nginx 비밀번호로 보호된 디렉터리를 성공적으로 활성화했지만 동시에 Apache 웹 서버가 시스템에 설치되어 있으므로 비활성화된 상태로 유지하고 어떤 방법으로든 시작하지 마십시오. Nginx와 충돌하는 포트.
5단계: Nginx에서 HTTP를 HTTPS로 리디렉션
21. 브라우저가 모든 안전하지 않은 HTTP 요청을 HTTPS 프로토콜로 자동 리디렉션하고 편집하려면 비 SSL 가상 호스트이고 server_name 지시어.
rewrite ^ https://$server_name$request_uri? permanent;
이 문서에 제시된 모든 설정은 서버 역할을 하는 Arch Linux 시스템에서 이루어졌지만 대부분, 특히 Nginx 구성 파일과 관련된 설정은 약간의 차이가 있지만 대부분의 Linux 시스템에서 사용할 수 있습니다.