웹사이트 검색

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 시스템에서 사용할 수 있습니다.