웹 서버는 어떻게 작동하나요? 데이터베이스 서버

서버 장비를 포함한 모든 장비가 때때로 예기치 않게 작동하기 시작합니다. 이 장비가 새 장비인지, 아니면 몇 년 동안 최대 부하로 작동해 왔는지는 전혀 중요하지 않습니다.

고장이나 오작동 사례가 많아 문제 진단이 매혹적인 퍼즐로 변하는 경우가 많습니다.

아래에서는 흥미롭고 사소하지 않은 몇 가지 사례에 대해 이야기하겠습니다.

문제 해결

문제는 클라이언트가 서비스에 문의한 후에 가장 자주 등록됩니다. 기술적 지원티켓 시스템을 통해

고객이 당사에 연락하여 고정 구성 전용 서버를 임대하는 경우 당사는 진단을 수행하여 문제가 본질적으로 소프트웨어가 아님을 알아냅니다.

클라이언트는 일반적으로 소프트웨어 문제를 스스로 해결하지만 어떤 경우에도 시스템 관리자의 도움을 제공하려고 노력합니다.

문제가 하드웨어인 것이 확실해진 경우(예: 서버에서 부품을 볼 수 없는 경우) 랜덤 액세스 메모리), 이 경우에는 항상 유사한 서버 플랫폼이 예비되어 있습니다.

하드웨어 문제가 감지되면 장애가 발생한 서버의 디스크를 백업 서버로 전송하고 약간의 재구성 후에 네트워크 장비, 서버가 시작되고 있습니다. 따라서 데이터가 손실되지 않으며, 액세스 순간부터 가동 중지 시간이 20분을 초과하지 않습니다.

문제 및 해결 방법의 예

서버의 네트워크 오류

장애가 발생한 서버에서 백업 서버로 디스크를 전송한 후 서버의 네트워크가 작동을 멈출 가능성이 있습니다. 이는 일반적으로 Debian 또는 Ubuntu와 같은 Linux 운영 체제를 사용할 때 발생합니다.

사실 운영 체제를 처음 설치하는 동안 MAC 주소는 네트워크 카드/etc/udev/rules.d/70-pertant-net.rules에 있는 특수 파일에 기록됩니다.

운영 체제가 시작되면 이 파일은 인터페이스 이름을 MAC 주소에 매핑합니다. 서버를 백업 서버로 교체하면 네트워크 인터페이스의 MAC 주소가 더 이상 일치하지 않아 서버에서 네트워크가 작동하지 않게 됩니다.

문제를 해결하려면 제거해야 합니다. 지정된 파일네트워크 서비스를 다시 시작하거나 서버를 다시 시작하세요.

이 파일을 찾지 못한 운영 체제는 자동으로 유사한 파일을 생성하고 인터페이스를 네트워크 카드의 새 MAC 주소와 일치시킵니다.

이후에는 IP 주소를 재구성할 필요가 없으며 네트워크가 즉시 작동하기 시작합니다.

부동 동결 문제

어느 날, 작동 중 임의의 정지 문제를 진단하기 위해 서버가 우리에게 왔습니다. BIOS 및 IPMI 로그를 확인했습니다. 비어 있고 오류가 없습니다. 우리는 스트레스 테스트를 실시하여 모든 프로세서 코어를 100%로 로드하는 동시에 온도를 모니터링했습니다. 작동 30분 후에 작동이 정지되었습니다.

동시에 프로세서는 정상적으로 작동했으며 부하시 온도가 표준 값을 초과하지 않았으며 모든 냉각기가 제대로 작동했습니다. 문제가 과열된 것이 아니라는 것이 분명해졌습니다.

다음으로 RAM 모듈에서 발생할 수 있는 오류를 배제해야 했기 때문에 꽤 인기 있는 Memtest86+를 사용하여 서버에 대한 메모리 테스트를 실시했습니다. 약 20분 후 예상대로 서버가 충돌하여 RAM 모듈 중 하나에 오류가 발생했습니다.

모듈을 새 모듈로 교체한 후 서버를 다시 테스트했지만 실패가 발생했습니다. 서버가 다시 정지되어 다른 RAM 모듈에 오류가 발생했습니다. 그들은 그를 대신하기도 했습니다. 또 다른 테스트 - 다시 정지되어 RAM에 다시 오류가 발생했습니다. RAM 슬롯을 주의 깊게 검사한 결과 결함이 발견되지 않았습니다.

남은 범인은 딱 한 명뿐이었다. CPU. 사실 RAM 컨트롤러는 프로세서 내부에 있으며 이 컨트롤러가 실패할 수 있다는 것입니다.

프로세서를 제거한 후 우리는 재난을 발견했습니다. 소켓의 핀 하나가 상단에서 부러졌고 핀의 부러진 끝이 문자 그대로 프로세서의 접촉 패드에 붙어 있었습니다. 그 결과 서버에 부하가 없을 때는 모든 것이 제대로 작동했지만 프로세서 온도가 높아지면 접점이 끊어져 RAM 컨트롤러의 정상적인 작동이 중단되어 정지 현상이 발생했습니다.

아쉽게도 부러진 소켓 핀을 복원할 수 없기 때문에 문제는 마더보드를 교체하여 마침내 해결되었으며 이는 이미 서비스 센터의 작업입니다.

OS 설치 중 가상의 서버 정지

장비 제조업체가 하드웨어 아키텍처를 변경하기 시작하고 새로운 기술을 선호하여 기존 기술에 대한 지원을 포기할 때 매우 재미있는 사례가 발생합니다.

한 사용자가 운영 체제를 설치하려고 할 때 서버가 정지된다는 불만을 제기했습니다. 윈도우 시스템서버 2008 R2. 설치 프로그램을 성공적으로 실행한 후 서버가 KVM 콘솔의 마우스 및 키보드에 대한 응답을 중지했습니다. 문제를 현지화하기 위해 물리적 마우스와 키보드를 서버에 연결했습니다. 모든 것이 동일하며 설치 프로그램이 입력 장치에 대한 응답을 시작하고 중지합니다.

당시 이 서버는 Supermicro에서 제조한 X11SSL-f 마더보드를 기반으로 한 최초의 서버 중 하나였습니다. 안에 BIOS 설정 Windows 7 설치에 비활성화로 설정된 흥미로운 항목이 하나 있었습니다. Windows 7, 2008 및 2008 R2가 동일한 설치 프로그램에 배포되었으므로 이 매개변수를 활성화로 설정하면 기적적으로 마우스와 키보드가 마침내 작동하기 시작했습니다. 그러나 이것은 운영 체제 설치로 인한 서사시의 시작일뿐입니다.

설치할 디스크를 선택할 때 디스크가 하나도 표시되지 않고, 게다가 설치 요구 사항 오류가 표시되었습니다. 추가 드라이버. 운영 체제는 USB 플래시 드라이브에서 설치되었으며 빠른 탐색인터넷에서는 설치 프로그램이 드라이버를 찾을 수 없는 경우 이러한 효과가 발생한다는 것을 보여주었습니다. USB 컨트롤러 3.0.

Wikipedia에서는 전원을 끄면 문제가 해결된다고 보고했습니다. BIOS 지원 USB 3.0(XHCI 컨트롤러). 마더보드에 대한 문서를 열었을 때 놀라운 일이 우리를 기다리고 있었습니다. 개발자는 XHCI(eXtensible Host Controller Interface)를 선호하여 EHCI(Enhanced Host Controller Interface) 컨트롤러를 완전히 포기하기로 결정했습니다. 즉, 이 마더보드의 모든 USB 포트는 USB 포트 3.0. 그리고 XHCI 컨트롤러를 비활성화하면 입력 장치도 비활성화되어 서버 작업이 불가능해지고 그에 따라 운영 체제가 설치됩니다.

서버 플랫폼에는 CD/DVD 디스크를 읽을 수 있는 드라이브가 장착되어 있지 않았기 때문에 문제에 대한 유일한 해결책은 드라이버를 운영 체제 배포판에 직접 통합하는 것이었습니다. USB 3.0 컨트롤러 드라이버를 통합하고 설치 이미지를 다시 구축해야만 이 서버에 Windows Server 2008 R2를 설치할 수 있었고 이 사례는 엔지니어가 헛된 시도에 불필요한 시간을 낭비하지 않도록 지식 기반에 포함되었습니다.

더 웃긴 경우는 고객이 배치를 위해 장비를 가져왔는데 예상대로 작동하지 않는 경우입니다. 이것이 바로 Dell PowerVault 디스크 쉘프 라인에서 발생한 일입니다.

이 장치는 두 개의 디스크 컨트롤러와 네트워크 인터페이스 iSCSI 프로토콜을 통한 작업용. 이러한 인터페이스 외에도 다음을 위한 MGMT 포트가 있습니다. 리모콘.

호스팅 장비에 대한 서비스 중에는 원격 서버 관리 도구를 연결해야 하는 경우 주문할 수 있는 특별 서비스인 "추가 10 Mbit/s 포트"가 있습니다. 이 자금은 다른 이름으로 사용됩니다.

  • Hewlett-Packard의 "iLO";
  • Dell의 "iDrac";
  • 슈퍼마이크로의 IPMI.
기능은 거의 동일합니다. 즉, 서버 상태를 모니터링하고 원격 콘솔에 액세스합니다. 따라서 높은 채널 속도가 필요하지 않습니다. 편안한 작업에는 10Mbit/s이면 충분합니다. 고객이 주문한 서비스입니다. 우리는 적절한 구리 배전을 배치하고 네트워크 장비의 포트를 구성했습니다.

속도를 제한하기 위해 포트는 간단히 10BASE-T로 구성되고 다음과 같이 활성화됩니다. 최대 속도 10Mbit/s에서. 모든 것이 준비된 후 Disk Shelf의 MGMT 포트를 연결했지만 클라이언트는 거의 즉시 아무것도 작동하지 않는다고 보고했습니다.

스위치 포트의 상태를 확인한 결과, "Physical link is down"이라는 불쾌한 메시지를 발견했습니다. 이 메시지는 스위치와 이에 연결된 클라이언트 장비 사이의 물리적 연결에 문제가 있음을 나타냅니다.

제대로 압착되지 않은 커넥터, 부러진 커넥터, 케이블의 끊어진 전선 - 이는 특히 링크 부족으로 이어지는 작은 문제 목록입니다. 물론 우리 엔지니어들은 즉시 연선 테스터를 사용하여 연결을 확인했습니다. 모든 전선이 완벽하게 연결되었으며 케이블의 양쪽 끝이 완벽하게 압착되었습니다. 그리고 이 케이블에 테스트 노트북을 연결하니 예상대로 10Mbit/s의 속도로 연결이 나왔습니다. 문제가 클라이언트의 장비 측에 있다는 것이 분명해졌습니다.

우리는 항상 고객이 문제를 해결할 수 있도록 돕기 위해 링크 부족의 정확한 원인을 파악하기로 결정했습니다. MGMT 포트 커넥터를주의 깊게 조사했습니다. 모든 것이 정상입니다.

제조사 홈페이지에서 찾아보니 원래 지침소프트웨어가 이 포트를 "끄는" 것이 가능한지 여부를 명확히 하기 위해 설명서를 참조하십시오. 그러나 이러한 가능성은 제공되지 않았습니다. 어떤 경우에도 포트가 자동으로 발생했습니다. 이러한 장비는 항상 Auto-MDI(X)를 지원해야 한다는 사실에도 불구하고, 즉 어떤 케이블이 일반 또는 크로스오버로 연결되어 있는지 정확하게 확인해야 하지만 실험을 위해 크로스오버를 압착하여 동일한 스위치 포트에 포함시켰습니다. 스위치 포트에 이중 매개변수를 강제 적용하려고 했습니다. 효과는 0이었습니다. 링크가 없었고 아이디어가 이미 부족했습니다.

여기서 엔지니어 중 한 명은 장비가 10BASE-T를 지원하지 않고 100BASE-TX 또는 심지어 1000BASE-X에서만 작동한다는 완전히 직관에 반하는 가정을 했습니다. 일반적으로 가장 저렴한 장치의 모든 포트는 10BASE-T와 호환되며 처음에는 엔지니어의 가정이 "허구"로 일축되었지만 필사적으로 포트를 100BASE-TX로 전환하기로 결정했습니다.

우리의 놀라움은 끝이 없었고 링크가 즉시 올라갔습니다. MGMT 포트에서 10BASE-T 지원이 부족한 정확한 원인은 여전히 ​​미스터리입니다. 그러한 경우는 매우 드물지만 발생합니다.

클라이언트는 우리 못지않게 놀랐으며 문제를 해결해준 것에 대해 매우 감사했습니다. 따라서 그들은 내장된 속도 제한 메커니즘을 사용하여 포트의 속도를 직접 제한하면서 100BASE-TX의 포트를 떠났습니다.

냉각 터빈 고장

어느 날 고객이 찾아와서 서버를 철거하고 서비스 지역으로 옮겨달라고 요청했습니다. 엔지니어들은 모든 작업을 수행하고 장비만 가지고 그를 혼자 두었습니다. 한 시간, 두 시간, 세 시간이 지났습니다. 클라이언트가 계속 서버를 시작/중지했고 우리는 문제가 무엇인지 물었습니다.

Hewlett-Packard 서버의 냉각 터빈 6개 중 2개가 고장난 것으로 나타났습니다. 서버가 켜지고 냉각 오류가 표시되며 즉시 꺼집니다. 이 경우 서버는 중요한 서비스가 포함된 하이퍼바이저를 호스팅합니다. 서비스의 정상적인 운영을 복원하기 위해 긴급 마이그레이션이 필요했습니다. 가상 머신다른 물리적 노드로.

우리는 다음과 같은 방법으로 고객을 돕기로 결정했습니다. 일반적으로 서버는 회전 수를 읽는 것만으로도 냉각 팬에 문제가 없다는 것을 이해합니다. 동시에 Hewlett-Packard 엔지니어는 원래 터빈을 비표준 커넥터, 비표준 핀아웃과 같은 아날로그로 교체하는 것이 불가능하도록 모든 작업을 수행했습니다.

해당 부품의 원본 가격은 약 100달러이며 그냥 가서 구입할 수는 없으며 해외에서 주문해야 합니다. 다행히 인터넷에서 원래 핀아웃이 있는 회로를 찾았고 핀 중 하나가 초당 엔진 회전 수를 읽는 역할을 한다는 것을 알아냈습니다.

나머지는 기술의 문제였습니다. 우리는 프로토타입 제작을 위해 몇 개의 전선을 사용했고(우연히 우리는 가까이 있었습니다. 우리 엔지니어 중 일부는 Arduino에 열중했습니다) 단순히 인접한 작동 터빈의 핀을 실패한 터빈의 커넥터와 연결했습니다. . 서버가 시작되었고 클라이언트는 마침내 가상 머신을 마이그레이션하고 서비스를 시작했습니다.

물론 이 모든 것은 전적으로 고객의 책임하에 수행되었지만 결국 이러한 비표준 조치를 통해 가동 중지 시간을 최소한으로 줄일 수 있었습니다.

디스크는 어디에 있나요?

어떤 경우에는 문제의 원인이 너무 사소해서 찾는 데 매우 많은 시간이 걸리는 경우도 있습니다. 우리 고객 중 한 명이 무작위 디스크 오류와 서버 정지에 대해 불평했을 때 이런 일이 일어났습니다. 하드웨어 플랫폼 - 36개 드라이브를 연결하기 위한 케이지가 포함된 케이스 847(4U 폼 팩터)의 Supermicro. 서버에는 3개의 동일한 Adaptec RAID 컨트롤러가 설치되어 있으며 각각 12개의 디스크가 연결되어 있습니다. 문제가 발생하면 서버에서 임의의 수의 디스크 표시가 중단되고 정지되었습니다. 서버의 생산이 중단되고 진단이 시작되었습니다.

우리가 가장 먼저 알아낸 것은 하나의 컨트롤러에서만 디스크가 떨어지고 있다는 것입니다. 동시에 기본 Adaptec 관리 유틸리티의 목록에서 "삭제된 드라이브"가 사라졌다가 다음 경우에만 다시 나타납니다. 완전 종료서버 전원 공급 장치 및 후속 연결. 가장 먼저 떠오른 것은 소프트웨어제어 장치. 세 컨트롤러 모두 펌웨어가 조금씩 다르기 때문에 모든 컨트롤러에 동일한 펌웨어 버전을 설치하기로 결정했습니다. 우리는 서버를 최대 로드 모드로 실행했습니다. 모든 것이 예상대로 작동했습니다. 문제가 해결된 것으로 표시되면 서버가 프로덕션을 위해 클라이언트로 반환되었습니다.

2주 후에 또 같은 문제가 발생했습니다. 컨트롤러를 유사한 컨트롤러로 교체하기로 결정했습니다. 우리는 그것을 완성하고, 플래시하고, 연결하고, 테스트했습니다. 문제는 여전히 남아 있습니다. 며칠 후 새 컨트롤러의 모든 디스크가 떨어지고 서버가 안전하게 정지되었습니다.

컨트롤러를 다른 슬롯에 다시 설치하고 컨트롤러에서 백플레인으로 백플레인과 SATA 케이블을 교체했습니다. 일주일 동안 테스트를 하고 다시 디스크가 떨어졌습니다. 서버가 다시 정지되었습니다. Adaptec 지원팀에 문의해도 아무런 결과가 나오지 않았습니다. 세 개의 컨트롤러를 모두 확인한 결과 아무런 문제도 발견되지 않았습니다. 교체됨 마더보드, 거의 처음부터 플랫폼을 재구축합니다. 약간의 의심을 불러일으키는 모든 것이 새로운 것으로 교체되었습니다. 그리고 문제가 다시 나타났습니다. 신비주의 그 이상은 아닙니다.

각 디스크를 개별적으로 검사하기 시작했을 때 우연히 문제가 해결되었습니다. 특정 부하에서 디스크 중 하나가 머리를 두드리기 시작하여 단락 SATA 포트에 연결했지만 경보 표시가 없었습니다. 동시에 컨트롤러는 일부 디스크 표시를 중단하고 전원 공급 장치가 다시 연결된 경우에만 다시 인식하기 시작했습니다. 이것이 하나의 실패한 디스크가 전체 서버 플랫폼을 다운시키는 방법입니다.

결론

물론 이는 우리 엔지니어들이 해결한 흥미로운 상황 중 극히 일부일 뿐입니다. 일부 문제는 "잡기"가 매우 어렵습니다. 특히 발생한 오류 로그에 힌트가 없는 경우 더욱 그렇습니다. 그러나 이러한 상황은 엔지니어가 서버 장비의 설계를 자세히 이해하고 문제에 대한 다양한 솔루션을 찾도록 자극합니다.

우리 실습에서 일어난 재미있는 사례입니다.
어떤 것을 접해보셨나요? 댓글에 오신 것을 환영합니다.

일반적으로 일반 사용자는 "웹 서버" 또는 "호스팅"과 같은 개념을 완전히 이해할 수 없는 것과 연관시킵니다. 한편, 이 문제에는 복잡한 것이 없습니다. 우리는 기술적 세부 사항을 다루지 않고 말하자면 웹 서버가 무엇인지, 왜 필요한지, 어떻게 작동하는지 설명하려고 노력할 것입니다. 가정용 컴퓨터 터미널이나 랩톱에서 이러한 서버를 만들고 구성하는 방법에 대한 질문을 별도로 살펴 보겠습니다.

웹 서버란 무엇입니까?

에서 가장 중요한 것은 이 문제- 이 유형의 서버는 적절한 소프트웨어가 설치된 인터넷상의 컴퓨터에 불과하다는 점을 이해하십시오.

그러나 이것이 집에서 자신만의 구성을 만들 수 없다는 의미는 아닙니다. 우리나라에서는 Windows 운영 체제가 더 일반적이므로 Ubuntu(Linux)에서 웹 서버를 만드는 방법에 대한 질문은 고려되지 않습니다.

웹 서버는 무엇을 위한 것인가요?

이러한 유형의 서버는 인터넷에 많은 정보를 저장합니다. 동시에 동일한 바이러스 백신이 자체 데이터베이스를 업데이트합니다. 또한 사용자는 브라우저에서 요청(정보 검색, 페이지 액세스 등)을 함으로써 해당 서버와 직접적인 관계를 갖습니다.

따라서 인터넷에 존재하는 모든 페이지는 웹 서버에 저장되며, 한편으로는 사용자 요청 또는 요청이 이루어지는 것으로 나타났습니다. 설치된 프로그램, 반면에 결과는 액세스를 시도한 바로 그 서버에 의해 생성됩니다.

어떻게 작동하나요?

모든 사용자는 특정 유형의 정보가 있는 인터넷(웹 페이지)에 일부 리소스를 입력하려면 접두사 www(또는 http)와 후속 이름을 주소 표시줄에 입력하기만 하면 된다는 사실에 익숙합니다. 그러나 웹 서버가 요청을 어떻게 이해하고 결과를 생성하는지에 대해서는 아무도 생각하지 않습니다.

실제로 여기서는 서버와 클라이언트의 개념을 구별해야 합니다. 우리의 경우 인터넷에 게시된 페이지가 정확히 다음 페이지에 저장됩니다. 원격 서버. 사용자의 컴퓨터는 호출이 이루어지는 클라이언트 역할을 합니다.

인터넷에 접속하려면 웹 브라우저라는 프로그램을 사용합니다. 이는 사용자 요청을 웹 서버가 인식할 수 있는 디지털 코드로 변환합니다. 서버는 이를 처리하고 적절한 코드로 응답을 생성하며, 브라우저는 이미 수백만 개의 0과 1을 페이지에 배치된 텍스트, 그래픽, 사운드 또는 비디오 정보와 함께 일반 형식으로 변환합니다.

가장 인기 있는 웹 서버

모든 서버 소프트웨어 중에서 Apache와 Microsoft IIS가 가장 일반적인 것으로 간주됩니다. 첫 번째는 더 널리 사용되며 대부분 UNIX 계열 시스템에서 사용됩니다. 윈도우 환경. 또한 Apache 서버는 완전 무료 소프트웨어이며 알려진 거의 모든 서버와 호환됩니다. 운영체제. 그러나 언급한 바와 같이 이 소프트웨어는 주로 전문 프로그래머와 개발자를 대상으로 합니다.

Microsoft 소프트웨어 제품은 자격을 갖춘 전문가의 추가 도움 없이 Windows용 웹 서버를 설치하고 구성할 수 있는 일반 사용자를 위해 설계되었습니다.

하지만 공식 통계에 따르면 아파치 소프트웨어는 기존 서버 전체의 약 60%를 사용하고 있기 때문에 초기 구성에 대한 설치 및 구성 문제를 그 예시를 통해 살펴보도록 하겠다.

가정용 컴퓨터의 웹 서버: 설치

설치하려면 세 가지 주요 구성 요소가 포함된 WAMP라는 특수 서버 패키지를 다운로드해야 합니다.

  • 아파치- 껍데기독립적으로 작동할 수 있지만 호스팅된 페이지에 동적 콘텐츠가 없는 경우에만 가능합니다.
  • PHP는 WordPress, Joomla, Drupal과 같은 동적 콘텐츠 서버를 관리하기 위해 추가 기능에서 사용되는 프로그래밍 언어입니다.
  • MySQL은 동적 콘텐츠가 포함된 사이트를 만들 때 다시 사용되는 통합 데이터베이스 관리 시스템입니다.

설치는 WampServer 패키지에서 수행할 수 있습니다. 이렇게 하려면 한 단계에서 기본적으로 사용할 인터넷 브라우저를 선택하도록 제안하는 "마법사"의 지시를 따르십시오.

이렇게 하려면 브라우저 실행 파일이 있는 폴더로 이동해야 합니다. 인터넷 익스플로러, 일반적으로 Program Files 디렉터리에 있습니다). 동시에 브라우저 자체도 Windows 방화벽 예외 목록에 추가되어야 합니다. 마지막 단계에서 즉시 실행 항목 옆에 있는 확인란을 선택하면 시스템 트레이에 해당 아이콘이 표시됩니다. 이 아이콘을 클릭하고 로컬 호스트 실행을 선택하도록 변경해야 합니다.

모든 작업이 올바르게 완료되면 서버 홈 페이지가 나타납니다. 다음으로, 추가 구성 요소를 설치하라는 메시지가 표시됩니다. 설치하지 않으면 시스템에서 오류가 발생합니다. 기본적으로 설치에는 향후 서버에서 사용할 추가 추가 기능, 요소 및 구성 요소가 포함됩니다.

서버 설정 및 테스트의 예

웹 서버를 설정하는 것은 조금 더 복잡합니다. 먼저 시스템 트레이 메뉴에서 WWW 폴더(추가 기능이나 HTML 파일이 저장된 위치)를 선택합니다. 그런 다음 메모장에 다음 텍스트를 작성합니다.

WAMP 테스트!

안녕하세요!

"; ?>

텍스트를 메모장에 복사하고 같은 WWW 폴더에 index.php라는 이름으로 파일을 저장할 수 있습니다. (이 단계는 로컬 호스트를 확인하는 데에만 사용되므로 메모장 없이도 가능합니다.) 인사말 대신 다른 텍스트나 문구를 삽입할 수 있습니다.

그런 다음 브라우저에서 페이지를 새로 고치고(F5), 그러면 콘텐츠가 화면에 표시됩니다. 하지만 다른 컴퓨터에서는 해당 페이지에 액세스할 수 없습니다.

액세스를 열려면 httpd.conf 파일을 변경하고 다음으로 시작하는 섹션을 작성해야 합니다. 다음 줄:

주문 허용, 거부

뒷말 대신

물론 홈 웹 서버의 기능이나 설정의 본질을 이해하는 것과 관련하여 여기서는 일반적인 이해를 위해 가장 초기적이고 간단한 정보만 제공합니다. 실제로 집에 서버를 설정하는 것은 말할 것도 없고, 특히 요청 변환 및 응답 발행 측면에서 모든 프로세스가 훨씬 더 복잡합니다. 사용자가 이러한 문제를 이해하고 싶다면 동일한 WordPress 추가 기능 및 PHP 언어에 대한 최소한의 기본 지식 없이는 할 수 없습니다. 반면에 대부분 다음과 같은 내용을 포함하는 기본 페이지를 게시하려면 텍스트 정보, 이 초기 정보를 사용할 수 있습니다.

웹 서버란 무엇입니까? 일반인의 관점에서 볼 때 이는 브라우저 요청을 처리하고 그에 대한 응답으로 웹 페이지를 생성하는 일종의 블랙박스입니다. 기술자는 당신에게 모호한 용어를 많이 퍼부을 것입니다. 결과적으로, 초보 웹 서버 관리자가 다양한 용어와 기술을 이해하기 어려울 때가 있습니다. 실제로 웹 개발 분야는 역동적으로 발전하고 있지만 많은 최신 솔루션은 오늘 우리가 이야기할 기본 기술과 원칙을 기반으로 합니다.

어디서부터 시작해야 할지 모른다면 처음부터 다시 시작해야 합니다. 다양한 최신 웹 기술에 혼동하지 않으려면 역사를 통해 그것이 어디서 시작되었는지 이해해야 합니다. 현대 인터넷기술이 어떻게 발전하고 개선되었는지.

HTTP 서버

인터넷 개발 초기에 사이트는 특별히 표시된 문서와 일부 관련 데이터(파일, 이미지 등)를 저장하는 단순한 저장소였습니다. 문서가 서로 참조하고 관련 데이터를 참조할 수 있도록 특수한 하이퍼텍스트 언어가 제안되었습니다. HTML 마크업, 인터넷, HTTP 프로토콜을 통해 이러한 문서에 액세스합니다. 개발 및 개선되는 언어와 프로토콜은 모두 큰 변화 없이 오늘날까지 살아 남았습니다. 그리고 1999년에 채택된 HTTP/1.1 프로토콜을 이제 막 대체하기 시작한 HTTP/2 프로토콜은 극적인 변화최신 네트워크의 요구 사항을 고려합니다.

HTTP 프로토콜은 클라이언트-서버 기술을 사용하여 구현되며 상태 비저장 요청-응답 원칙에 따라 작동합니다. 요청의 목적은 결정된 특정 리소스입니다. 단일 리소스 식별자 - URI (통일 자원 식별자), HTTP는 URI 종류 중 하나를 사용합니다. URL (유니폼 리소스 로케이터) - 유니폼 리소스 로케이터, 리소스에 대한 정보 외에도 물리적 위치도 결정합니다.

HTTP 서버의 임무는 클라이언트의 요청을 처리하고 필요한 리소스를 제공하거나 그렇게 하는 것이 불가능하다고 보고하는 것입니다. 다음 다이어그램을 고려하십시오.


사용자는 HTTP 클라이언트(주로 브라우저)를 통해 HTTP 서버에서 특정 URL을 요청하고, 서버는 해당 URL 파일(일반적으로 HTML 페이지)을 확인하고 전송합니다. 결과 문서에는 이미지와 같은 관련 리소스에 대한 링크가 포함될 수 있습니다. 페이지에 표시해야 하는 경우에는 클라이언트가 서버에 순차적으로 요청하며, 이미지 외에 클라이언트 측에서 실행되는 스타일시트, 스크립트 등도 요청할 수 있습니다. 다 받아본 결과 필요한 자원브라우저는 HTML 문서의 코드에 따라 이를 처리하고 완성된 페이지를 사용자에게 표시합니다.

많은 사람들이 이미 추측한 것처럼, 이 체계의 HTTP 서버 이름 아래에는 오늘날 웹 서버로 더 잘 알려진 개체가 있습니다. 웹 서버의 주요 목표와 작업은 HTTP 요청을 처리하고 그 결과를 사용자에게 반환하는 것입니다. 웹 서버는 자체적으로 콘텐츠를 생성할 수 없으며 정적 콘텐츠로만 작동합니다. 이는 기능이 풍부함에도 불구하고 최신 웹 서버에도 적용됩니다.

오랫동안 본격적인 웹사이트를 구현하는 데에는 웹 서버 하나면 충분했습니다. 그러나 인터넷이 성장함에 따라 정적 HTML의 기능은 매우 부족해졌습니다. 간단한 예: 각 정적 페이지는 자체적으로 충분하며 이와 관련된 모든 리소스에 대한 링크를 포함해야 합니다. 새 페이지를 추가할 때 해당 페이지에 대한 링크를 기존 페이지에 추가해야 합니다. 그렇지 않으면 사용자가 해당 페이지에 접근할 수 없습니다. .

그 당시의 사이트는 일반적으로 현대 사이트와 거의 유사하지 않습니다. 예를 들어 다음은 러시아어 인터넷의 선구자 중 하나인 Rambler 회사 사이트의 보기입니다.

그리고 링크 중 하나를 클릭하면 일반적으로 현대 사용자에게 혼란을 줄 수 있으므로 브라우저에서 동일한 이름의 버튼을 누르는 경우를 제외하고는 해당 페이지에서 돌아갈 수 없습니다.

현대 웹사이트와 다소 유사한 것을 만들려는 시도는 곧 기존 페이지를 변경하는 작업의 양이 늘어나게 되었습니다. 결국 사이트의 일반적인 부분(예: 헤더의 로고)에서 무언가를 변경했다면 기존의 모든 페이지에서 이 변경 작업을 수행해야 합니다. 그리고 페이지 중 하나의 경로를 변경하거나 삭제한 경우 해당 페이지에 대한 모든 링크를 찾아서 변경하거나 삭제해야 합니다.

따라서 웹 서버 개발의 다음 단계는 기술 지원이었습니다. 서버측 활성화자 - SSI (서버 측 포함). 페이지 코드에 다른 파일의 내용을 포함할 수 있게 되었고, 이로 인해 머리글, 바닥글, 메뉴 등 반복되는 요소를 제거할 수 있게 되었습니다. 별도의 파일로 저장하고 페이지의 최종 조립 중에 포함하기만 하면 됩니다.

이제 로고나 메뉴 항목을 변경하려면 기존 페이지를 모두 편집하는 대신 파일 하나만 변경하면 됩니다. 또한 SSI를 사용하면 현재 날짜와 같은 일부 동적 콘텐츠를 페이지에 표시하고 간단한 조건을 수행하고 변수를 사용하여 작업할 수 있습니다. 이는 웹마스터의 업무를 더욱 쉽게 만들고 사용자의 편의성을 향상시키는 중요한 진전이었습니다. 그러나 이러한 기술로는 여전히 진정한 동적 웹사이트를 구현할 수 없었습니다.

SSI는 단순성과 리소스 요구 사항이 낮기 때문에 일부 정적 콘텐츠를 페이지 코드에 삽입해야 하는 오늘날에도 여전히 활발하게 사용되고 있다는 점은 주목할 가치가 있습니다.

CGI

웹 기술 발전의 다음 단계는 출현이었습니다. 특별 프로그램(스크립트) 서버 측에서 사용자 요청을 처리합니다. 대부분의 경우 스크립팅 언어로 작성됩니다. 처음에는 Perl이었지만 오늘날에는 PHP가 선두를 차지하고 있습니다. 점차적으로 콘텐츠 관리 시스템이라는 전체 종류의 프로그램이 등장했습니다. CMS (콘텐츠 관리 시스템)은 사용자 요청을 동적으로 처리할 수 있는 본격적인 웹 애플리케이션을 나타냅니다.

지금 중요한 점: 웹 서버는 스크립트를 실행하는 방법을 알지 못했고 알지도 못했습니다. 웹 서버의 임무는 정적 콘텐츠를 제공하는 것입니다. 여기에는 스크립팅 언어의 해석기이자 그 언어로 작성된 웹 애플리케이션이 실행되는 도움을 받는 애플리케이션 서버라는 새로운 개체가 등장합니다. DBMS는 대량의 상호 연관된 정보에 액세스해야 하기 때문에 일반적으로 데이터를 저장하는 데 사용됩니다.

그러나 애플리케이션 서버는 HTTP 프로토콜로 작업하고 사용자 요청을 처리할 수 없습니다. 이는 웹 서버의 작업이기 때문입니다. 상호작용을 보장하기 위해 개발되었습니다. 공통 게이트웨이 인터페이스 - CGI (공통 게이트웨이 인터페이스).

CGI는 프로그램이나 프로토콜이 아니라 정확히 인터페이스라는 점을 분명히 이해해야 합니다. 애플리케이션 간의 상호작용 방식 세트입니다. 또한 CGI라는 용어를 CGI 인터페이스를 통해 작업을 지원하는 프로그램(스크립트)을 나타내는 CGI 응용 프로그램 또는 CGI 스크립트의 개념과 혼동해서는 안 됩니다.

표준 입력/출력 스트림은 데이터를 전송하는 데 사용됩니다. 데이터는 다음을 통해 웹 서버에서 CGI 응용 프로그램으로 전송됩니다. 표준 입력, 을(를) 통해 다시 허용됩니다. 표준 출력, 오류 메시지를 전송하는 데 사용됩니다. 표준 오류.

이러한 시스템의 운영 과정을 좀 더 자세히 살펴보겠습니다. 사용자의 브라우저로부터 요청을 받은 웹 서버는 동적 콘텐츠가 요청되었는지 확인하고 특별한 요청을 생성하여 CGI 인터페이스를 통해 웹 애플리케이션에 보냅니다. 이를 수신하면 애플리케이션이 실행되고 요청이 이루어지며, 그 결과 동적으로 생성된 페이지의 HTML 코드가 웹 서버로 다시 전달된 후 애플리케이션이 종료됩니다.

동적 사이트의 또 다른 중요한 차이점은 해당 페이지가 사용자에게 표시되는 형식으로 물리적으로 존재하지 않는다는 것입니다. 실제로 웹 애플리케이션이 있습니다. 스크립트 및 템플릿 세트, 사이트 자료를 저장하는 데이터베이스 및 공식 정보, 정적 콘텐츠는 그림, 자바 스크립트, 파일 등 별도로 위치합니다.

요청을 받은 웹 애플리케이션은 데이터베이스에서 데이터를 검색하고 요청에 지정된 템플릿으로 데이터를 채웁니다. 결과는 웹 서버로 전송되며, 웹 서버는 이렇게 생성된 페이지를 정적 콘텐츠(이미지, 스크립트, 스타일)로 보완하여 사용자의 브라우저로 전송합니다. 페이지 자체는 캐시 외에는 어디에도 저장되지 않으며, 새로운 요청이 수신되면 페이지가 다시 생성됩니다.

CGI의 장점에는 언어 및 구조적 독립성이 포함됩니다. CGI 응용 프로그램은 어떤 언어로든 작성될 수 있으며 모든 웹 서버에서 동일하게 작동합니다. 표준의 단순성과 개방성을 고려하면 이는 웹 애플리케이션의 급속한 개발로 이어졌습니다.

그러나 CGI에는 장점 외에도 심각한 단점도 있습니다. 주요한 것은 프로세스를 시작하고 중지하는 데 드는 높은 오버헤드 비용입니다. 이는 하드웨어 리소스에 대한 요구 사항이 증가하는 것을 수반합니다. 고성능. 그리고 표준 I/O 스트림을 사용하면 웹 서버와 애플리케이션 서버가 동일한 시스템에 있어야 하기 때문에 확장성과 고가용성이 제한됩니다.

현재 CGI는 고급 기술로 대체되었으므로 실제로 사용되지 않습니다.

빠른CGI

이름에서 알 수 있듯이 이 기술 개발의 주요 목표는 CGI 성능을 향상시키는 것이었습니다. 추가 개발을 통해 FastCGI는 웹 서버와 응용 프로그램 서버 간의 상호 작용을 위한 클라이언트-서버 프로토콜로, 높은 성능과 보안을 제공합니다.

FastCGI는 CGI의 주요 문제를 제거합니다. 각 요청에 대해 웹 애플리케이션 프로세스를 다시 시작하고 FastCGI 프로세스가 지속적으로 실행되므로 시간과 리소스를 크게 절약할 수 있습니다. 데이터 전송을 위해 표준 스트림 대신 다음을 사용합니다. UNIX 소켓또는 TCP/IP, 이를 통해 웹 서버와 애플리케이션 서버를 서로 다른 호스트에 호스팅할 수 있으므로 시스템의 확장성 및/또는 고가용성이 보장됩니다.

또한 요청을 병렬로 처리하거나 스크립팅 언어의 설정이나 버전이 다른 여러 FastCGI 프로세스를 한 컴퓨터에서 실행할 수도 있습니다. 예를 들어, 여러 사이트에 대해 여러 버전의 PHP를 동시에 보유하여 해당 요청을 다른 FastCGI 프로세스로 전달할 수 있습니다.

프로세스 관리자는 FastCGI 프로세스 및 로드 분산을 관리하는 데 사용되며 웹 서버의 일부이거나 별도의 응용 프로그램일 수 있습니다. 널리 사용되는 웹 서버인 Apache와 Lighttpd에는 FastCGI 프로세스 관리자가 내장되어 있지만 Nginx에서는 FastCGI와 함께 작동하려면 외부 관리자가 필요합니다.

PHP-FPM 및 스폰-fcgi

FastCGI 프로세스의 외부 관리자에는 PHP-FPM 및 generate-fcgi가 포함됩니다. PHP-FPM은 원래 Andrey Nigmatulin의 PHP용 패치 세트로 FastCGI 프로세스 관리와 관련된 여러 문제를 해결했으며 버전 5.3부터 프로젝트의 일부이며 PHP 배포판에 포함되어 있습니다. PHP-FPM은 로드에 따라 PHP 프로세스 수를 동적으로 관리하고, 요청 손실 없이 풀을 다시 로드하고, 실패한 프로세스를 긴급하게 다시 시작할 수 있으며 상당히 진보된 관리자입니다.

Spawn-fcgi는 Lighttpd 프로젝트의 일부이지만 동일한 이름의 웹 서버의 일부는 아닙니다. 기본적으로 Lighttpd는 자체적이고 간단한 프로세스 관리자를 사용합니다. 개발자는 다른 호스트에 있는 FastCGI 프로세스를 관리해야 하거나 고급 보안 설정이 필요한 경우 이 기능을 사용할 것을 권장합니다.

외부 관리자를 사용하면 각 FastCGI 프로세스를 자체 chroot(다른 프로세스의 chroot 및 웹 서버의 chroot와는 다른) 자체 chroot(해당 권한 없이 애플리케이션의 루트 디렉터리 변경)로 격리할 수 있습니다. 그리고 이미 말했듯이 TCP/IP를 통해 다른 서버에 있는 FastCGI 응용 프로그램으로 작업할 수 있습니다. 로컬 액세스빠른 연결 유형으로 UNIX 소켓을 통한 액세스를 선택해야 합니다.

다이어그램을 다시 보면 웹 서버와 애플리케이션 서버 사이의 중개자 역할을 하는 프로세스 관리자라는 새로운 요소가 있음을 알 수 있습니다. 구성하고 유지 관리해야 하므로 구성표가 다소 복잡해집니다. 많은 분량서비스를 제공하지만 동시에 더 넓은 가능성을 열어 서버의 각 요소를 작업에 맞게 특별히 맞춤화할 수 있습니다.

실제로 내장 관리자와 외부 관리자 중에서 선택할 때는 상황을 현명하게 평가하고 요구 사항에 가장 적합한 도구를 정확하게 선택하십시오. 예를 들어, 표준 엔진에서 여러 사이트에 대한 간단한 서버를 생성하는 경우 외부 관리자를 사용할 필요가 없습니다. 아무도 당신에게 자신의 관점을 강요하지 않지만. Linux의 좋은 점은 조립 키트를 사용하는 것처럼 누구나 필요한 것을 정확하게 조립할 수 있다는 것입니다.

SCGI, PCGI, PSGI, WSGI 및 기타

웹 개발이라는 주제를 탐구하면서 다양한 CGI 기술에 대한 참조를 접하게 될 것입니다. 그 중 가장 인기 있는 기술은 제목에 나열되어 있습니다. 이러한 다양성으로 인해 혼란스러울 수 있지만 기사의 시작 부분을 주의 깊게 읽으면 CGI와 FastCGI의 작동 방식을 알 수 있으므로 이러한 기술을 이해하는 것이 어렵지 않을 것입니다.

하나 또는 다른 솔루션 구현의 차이에도 불구하고 기본 원리들일반적으로 유지됩니다. 이러한 모든 기술은 게이트웨이 인터페이스( 게이트웨이 인터페이스) 웹 서버와 애플리케이션 서버 간의 상호 작용을 위해. 게이트웨이를 사용하면 웹 서버와 웹 애플리케이션 환경을 분리할 수 있으므로 비호환 가능성에 관계없이 어떤 조합이라도 사용할 수 있습니다. 간단히 말해서, 필요한 게이트웨이 유형을 처리할 수 있는 한 웹 서버가 특정 기술이나 스크립팅 언어를 지원하는지 여부는 중요하지 않습니다.

제목에 이미 많은 약어가 나열되어 있으므로 더 자세히 살펴보겠습니다.

SCGI (간단한 공통 게이트웨이 인터페이스) - 간단한 공통 게이트웨이 인터페이스- CGI의 대안으로 설계되었으며 여러 면에서 FastCGI와 유사하지만 구현하기가 더 쉽습니다. FastGCI와 관련하여 우리가 이야기한 모든 내용은 SCGI에도 적용됩니다.

PCGI (Perl 공통 게이트웨이 인터페이스) - CGI 인터페이스 작업을 위한 Perl 라이브러리, 오랫동안 CGI를 통해 Perl 응용 프로그램으로 작업하기 위한 주요 옵션으로 적당한 리소스 요구 사항과 우수한 과부하 보호 기능을 갖춘 우수한 성능(CGI에 관한 한)을 제공합니다.

PSGI (Perl 웹 서버 게이트웨이 인터페이스) - Perl용 웹 서버와 애플리케이션 서버 간의 상호 작용을 위한 기술입니다. PCGI가 클래식 CGI 인터페이스 작업을 위한 도구라면 PSGI는 FastCGI를 더 연상시킵니다. PSGI 서버는 지속적으로 서비스로 실행되고 TCP/IP 또는 UNIX 소켓을 통해 웹 서버와 통신할 수 있으며 Perl 애플리케이션에 FastCGI와 동일한 이점을 제공하는 Perl 애플리케이션을 실행하기 위한 환경을 제공합니다.

WSGI (웹 서버 게이트웨이 인터페이스)는 Phyton 언어로 작성된 프로그램을 위한 웹 서버와 애플리케이션 서버 간의 상호 작용을 위해 설계된 또 다른 특정 게이트웨이 인터페이스입니다.

쉽게 볼 수 있듯이 우리가 나열한 모든 기술은 어느 정도 CGI/FastCGI와 유사하지만 특정 응용 분야에 대한 것입니다. 우리가 제공한 데이터는 작동 원리와 메커니즘을 전반적으로 이해하는 데 충분하며, 이에 대한 더 깊은 연구는 이러한 기술과 언어를 진지하게 사용할 때만 의미가 있습니다.

Apache 모듈로서의 애플리케이션 서버

이전에 추상적인 웹 서버에 대해 이야기했다면 이제는 구체적인 솔루션에 대해 이야기할 것이며 이는 우리가 선호하는 문제가 아닙니다. 웹 서버 중에서 Apache는 특별한 위치를 차지하는데, 대부분의 경우 Linux 플랫폼의 웹 서버, 그리고 일반적으로 웹 서버에 관해 이야기할 때 의미하는 것은 Apache입니다.

이것은 일종의 "기본" 웹 서버라고 말할 수 있습니다. 대량 호스팅을 사용하세요. Apache가 있고 웹 애플리케이션을 사용합니다. 기본 설정은 Apache용으로 지정됩니다.

예, 기술적 관점에서 볼 때 Apache는 기술의 왕관은 아니지만 황금률을 나타내며 간단하고 이해하기 쉽고 설정이 유연하며 보편적입니다. 웹 사이트 구축의 첫 번째 단계를 수행하는 경우 Apache가 선택됩니다.

여기서 우리는 Apache가 오래 전부터 구식이고 모든 "진짜 사람들"이 이미 Nginx를 설치했다는 등의 비난을 받을 수 있습니다. 등등 그래서 설명하자면 이 순간자세히. 널리 사용되는 모든 CMS는 기본적으로 Apache와 함께 사용하도록 구성되어 있으므로 문제의 원인이 될 수 있는 웹 서버를 제거하여 웹 응용 프로그램 작업에 모든 주의를 집중할 수 있습니다.

초보자들에게 인기 있는 모든 포럼에서는 Apache를 웹 서버로 사용하며 대부분의 팁과 권장 사항이 Apache에 특별히 적용됩니다. 동시에 대체 웹 서버는 일반적으로 웹 서버와 웹 애플리케이션 모두에서 더 미묘하고 신중한 구성이 필요합니다. 동시에 이러한 제품의 사용자는 일반적으로 훨씬 더 경험이 많으며 해당 환경에서 초보자의 일반적인 문제는 논의되지 않습니다. 결과적으로 아무것도 작동하지 않고 물어볼 사람이 없는 상황이 발생할 수 있습니다. Apache에서는 이런 일이 발생하지 않는 것이 보장됩니다.

실제로, 아파치 개발자들은 자신들의 아이디어가 특별한 자리를 차지할 수 있도록 무엇을 했습니까? 대답은 매우 간단합니다. 그들은 각자의 길을갔습니다. CGI는 특정 솔루션을 추상화하고 범용 게이트웨이에 초점을 맞추는 것을 제안했지만 Apache는 이를 다르게 수행했습니다. 즉, 웹 서버와 애플리케이션 서버를 최대한 통합했습니다.

실제로 애플리케이션 서버를 공통 주소 공간에서 웹 서버 모듈로 실행하면 훨씬 간단한 체계를 얻을 수 있습니다.

이는 어떤 이점을 제공합니까? 어떻게 더 간단한 계획포함된 요소가 적을수록 유지 관리가 더 쉽고 저렴해지며 실패 지점도 줄어듭니다. 단일 서버에서는 이것이 그다지 중요하지 않을 수 있지만 호스팅 내에서는 매우 중요한 요소입니다.

두 번째 장점은 생산성입니다. 다시 한번 말하지만, 단일 주소 공간에서 작업하는 덕분에 Nginx 팬들을 실망시킬 것입니다. Apache + mod_php 애플리케이션 서버의 성능은 항상 다른 웹 서버 + FastCGI(또는 다른 CGI 솔루션)보다 10-20% 더 빠릅니다. 그러나 사이트의 속도는 애플리케이션 서버의 성능뿐만 아니라 대체 웹 서버가 훨씬 더 나은 결과를 표시할 수 있는 기타 여러 조건에 따라 결정된다는 점도 기억해야 합니다.

그러나 매우 중요한 이점이 하나 더 있습니다. 즉, 개별 사이트나 사용자 수준에서 애플리케이션 서버를 구성할 수 있다는 것입니다. 조금 되돌아가 보겠습니다. FastCGI/CGI 체계에서 응용 프로그램 서버는 별도의 설정을 가진 별도의 서비스이며, 이는 다른 사용자나 다른 호스트를 대신하여 작동할 수도 있습니다. 단일 서버나 일부 대규모 프로젝트의 관리자 관점에서 보면 이는 훌륭하지만 사용자와 호스팅 관리자에게는 그리 많지 않습니다.

인터넷의 발달로 인해 가능한 웹 애플리케이션(CMS, 스크립트, 프레임워크 등)의 수가 매우 많아졌고, 낮은 진입 장벽으로 인해 특별한 기술 지식 없이도 많은 사람들이 웹 사이트에 접속하게 되었습니다. 웹사이트 구축. 동시에 다양한 웹 애플리케이션에는 다음이 필요할 수 있습니다. 다른 설정응용 프로그램 서버. 어떻게 해야 하나요? 매번 지원팀에 문의해야 합니까?

해결책은 매우 간단하다는 것이 밝혀졌습니다. 이제 애플리케이션 서버가 웹 서버의 일부이므로 웹 서버에 설정을 관리하도록 지시할 수 있습니다. 전통적으로 Apache 설정을 관리하기 위해 구성 파일 외에도 httaccess 파일이 사용되었습니다. 이 파일아래의 설정이 httaccess 파일과 겹치지 않는 경우. mod_php 모드에서 이 파일을 사용하면 개별 사이트나 디렉토리에 대한 많은 PHP 옵션을 변경할 수도 있습니다.

변경 사항을 적용하기 위해 웹 서버를 다시 시작할 필요가 없으며 오류가 발생하면 이 사이트(또는 그 일부)만 작동이 중지됩니다. 또한, 간단한 내용을 변경하세요. 텍스트 파일웹 사이트의 폴더에 넣는 것은 훈련받지 않은 사용자도 수행할 수 있으며 서버 전체에 안전합니다.

이러한 모든 장점의 조합으로 인해 Apache는 범용 웹 서버로서 널리 사용되고 지위를 얻게 되었습니다. 다른 솔루션이 더 빠르고 경제적이며 더 좋을 수도 있지만 항상 작업에 맞게 사용자 정의가 필요하므로 주로 대상 프로젝트에 사용됩니다. Apache는 대안 없이 대량 부문을 장악하고 있습니다.

장점을 이야기했으니 단점으로 넘어가겠습니다. 그들 중 일부는 단순히 동전의 뒷면입니다. 애플리케이션 서버가 웹 서버의 일부라는 사실은 성능과 구성 용이성 측면에서 이점을 제공하지만 동시에 보안 측면에서 우리를 제한합니다. 애플리케이션 서버는 항상 웹 서버를 대신하여 작동하며 시스템 유연성이 뛰어납니다. , 웹 서버와 애플리케이션 서버를 다른 호스트에 배포할 수 없으며 다음과 같은 서버를 사용할 수 없습니다. 다른 버전스크립팅 언어 또는 다른 설정.

두 번째 단점은 리소스 소비가 높다는 것입니다. CGI 체계에서 애플리케이션 서버는 페이지를 생성하고 이를 웹 서버로 전송하여 리소스를 확보합니다. Apache + mod_php 조합은 웹 서버가 페이지 내용을 클라이언트에 반환할 때까지 애플리케이션 서버의 리소스를 계속 사용합니다. 클라이언트가 느린 경우 전체 서비스 기간 동안 리소스가 사용됩니다. 그렇기 때문에 Nginx는 빠른 클라이언트 역할을 하는 Apache 앞에 배치되는 경우가 많습니다. 이를 통해 Apache는 클라이언트와의 상호 작용을 보다 경제적인 Nginx로 전환하여 페이지를 신속하게 제공하고 리소스를 확보할 수 있습니다.

결론

하나의 기사로 전체 스펙트럼을 포괄합니다. 현대 기술불가능했기 때문에 우리는 주요 내용에만 집중하고 의도적으로 일부 내용은 뒤에 남겨두고 상당한 단순화에 의지했습니다. 의심할 여지 없이, 이 분야에서 작업을 시작하면 해당 주제에 대한 더 깊은 연구가 필요하지만, 새로운 지식을 인식하려면 특정 이론적 기반이 필요합니다. 우리는 이 자료를 바탕으로 이를 구축하려고 했습니다.


이 기사에서는 웹 서버의 작동 패턴을 최대한 광범위하게 설명하려고 노력할 것입니다. 이는 종종 편향된 벤치마크를 기반으로 하지 않고 서버를 선택하거나 어떤 아키텍처가 더 빠른지 결정하는 데 도움이 됩니다.

일반적으로 이 기사는 "무슨 일이 일어나는지"에 대한 전반적인 개요입니다. 숫자가 없습니다.

이 기사는 서버 경험을 바탕으로 작성되었습니다.

  • Apache, Lighttpd, Nginx(C)
  • Tomcat, Jetty(Java)
  • 트위스트(파이썬)
  • 얼랭 OTP(얼랭 언어)
  • 그리고 운영 리눅스 시스템 FreeBSD

그러나 원칙은 Windows OS, Solaris 및 기타 수많은 웹 서버에 어떤 형태로든 적용되어야 할 정도로 일반적입니다.

웹 서버 목적

웹 서버의 목표는 간단합니다. 하드웨어를 최대한 효율적으로 사용하여 동시에 많은 수의 클라이언트에 서비스를 제공하는 것입니다. 이를 수행하는 방법 - 이것이 주요 문제이자 기사의 주제입니다.)

연결 작업

요청 처리는 어디서 시작되나요? 분명히 - 사용자로부터 연결을 수신합니다.

이를 위해 서로 다른 OS는 서로 다른 시스템 호출을 사용합니다. 가장 유명하고 연결이 많을 때 속도가 느림 - 선택. 더 효과적인 것은 poll, kpoll, epoll입니다.

최신 웹 서버는 점차 선택을 포기하고 있습니다.

OS 최적화

연결을 수락하기 전에도 OS 커널 수준에서 최적화가 가능합니다. 예를 들어, 연결을 받은 OS 커널은 이벤트 중 하나가 발생할 때까지 웹 서버를 방해하지 않을 수 있습니다.

  • 데이터가 아직 도착하지 않았습니다(dataready).
  • 전체 HTTP 요청이 도착할 때까지(httpready)

이 글을 쓰는 시점에서는 두 가지 방법 모두 FreeBSD(ACCEPT_FILTER_HTTP, ACCEPT_FITER_DATA)에서 지원되고 Linux에서는 첫 번째 방법(TCP_DEFER_ACCEPT)만 지원됩니다.

이러한 최적화를 통해 서버는 데이터를 기다리는 데 소요되는 시간을 줄여 전반적인 성능을 향상시킬 수 있습니다.

연결이 승인되었습니다.

따라서 연결이 승인됩니다. 이제 주요 작업은 서버의 어깨에 있습니다. 즉, 요청을 처리하고 방문자에게 응답을 보내는 것입니다. 여기서는 이미지를 반환하는 것보다 훨씬 더 복잡한 동적 쿼리만 고려하겠습니다.

모든 서버는 비동기식 접근 방식을 사용합니다.

이는 요청 처리가 "왼쪽" 어딘가로 푸시된다는 사실로 구성됩니다. 이는 실행을 위해 보조 프로세스/스레드에 제공되고 서버는 계속 작동하고 실행을 위해 모든 새 연결을 수락하고 전송합니다.

구현에 따라 "작업자" 프로세스는 전체 결과를 다시 서버로 보낼 수도 있고(나중에 클라이언트로 반환하기 위해) 결과에 대한 핸들만 서버로 보낼 수도 있고(복사하지 않고) 결과를 다음으로 반환할 수도 있습니다. 클라이언트 그 자체.

근로자와 협력하기 위한 기본 전략

작업자와의 작업은 다양한 방식으로 결합되어 다양한 결과를 얻을 수 있는 여러 요소로 구성됩니다.

작업자 유형

프로세스와 스레드라는 두 가지 주요 유형이 있습니다. 성능을 향상시키기 위해 때로는 두 유형을 동시에 사용하여 각각에 여러 프로세스와 여러 스레드를 생성합니다.

프로세스

서로 다른 작업자가 프로세스일 수 있으며, 이 경우 서로 상호 작용하지 않으며 서로 다른 작업자의 데이터는 서로 완전히 독립적입니다.

흐름

스레드는 프로세스와 달리 공통된 공유 데이터 구조를 가지고 있습니다. 작업자의 코드는 동일한 구조에 대한 동시 쓰기로 인해 혼란이 발생하지 않도록 액세스 동기화를 구현해야 합니다.

주소 공간

서버를 포함한 각 프로세스에는 데이터를 분리하는 데 사용되는 자체 주소 공간이 있습니다.

서버 내부

서버 내부에서 작업할 때 작업자는 서버 데이터에 액세스할 수 있습니다. 이는 모든 구조를 변경할 수 있으며, 특히 오류가 있는 경우에는 모든 종류의 불쾌한 작업을 수행할 수 있습니다.

장점은 한 주소 공간에서 다른 주소 공간으로 데이터가 전송되지 않는다는 것입니다.

서버 외부

작업자는 서버와 완전히 독립적으로 시작될 수 있으며 특수 프로토콜(예: FastCGI)을 사용하여 처리할 데이터를 받을 수 있습니다.

물론 이 옵션이 서버에 가장 안전합니다. 그러나 그것은 필요하다 추가 업무요청을 전달하여 - 서버와 작업자 간의 결과.

노동자의 탄생

많은 연결을 동시에 처리하려면 충분한 수의 작업자가 필요합니다.

두 가지 주요 전략이 있습니다.

정적

근로자 수는 엄격하게 정해질 수 있습니다. 예를 들어 총 20개의 작업 프로세스가 있습니다. 모든 작업자가 바쁘고 21번째 요청이 도착하면 서버는 임시 사용 불가 코드("일시적으로 사용할 수 없음")를 발행합니다.

역학

보다 유연한 리소스 관리를 위해 부하에 따라 작업자를 동적으로 생성할 수 있습니다. 작업자 생성 알고리즘은 다음과 같이 매개변수화될 수 있습니다(Apache 프리포크).

  • 사용 가능한 최소 작업자 수 = 5
  • 사용 가능한 최대 작업자 수 = 20
  • 총 근로자 수 = 30 이하
  • 초기 작업자 수 = 10

요청 간 청소

작업자는 요청 사이에 자신을 다시 초기화하거나 단순히 요청을 하나씩 처리할 수 있습니다.

깨끗한

각 요청 전에 이전 내용이 지워지고 내부 변수 등이 지워집니다.

결과적으로 이전 쿼리에서 남은 변수 사용과 관련된 문제나 오류가 없습니다.

지속성 있는

상태 정리가 없습니다. 결과적으로 자원이 절약됩니다.

일반적인 구성 분석

다양한 서버의 예에서 이러한 조합이 어떻게 작동하는지 살펴보겠습니다.

Apache(프리포크 MPM) + mod_php

처리를 위해 동적 쿼리서버 컨텍스트에서 실행되는 PHP 모듈이 사용됩니다.
  • 프로세스
  • 서버 내부
  • 역학
  • 깨끗한

Apache(작업자 MPM) + mod_php

동적 요청을 처리하기 위해 서버 컨텍스트에서 실행되는 PHP 모듈이 사용됩니다.

동시에, PHP는 서버의 주소 공간에서 작동하기 때문에 스트림에서 공유하는 데이터가 주기적으로 손상되므로 연결이 불안정하므로 권장되지 않습니다. 이는 PHP 코어와 다양한 PHP 모듈을 포함하는 mod_php의 버그 때문입니다.

하나의 주소 공간으로 인해 모듈에 오류가 발생하면 전체 서버가 다운될 수 있습니다.

  • 흐름
  • 서버 내부
  • 역학
  • 깨끗한

아파치(이벤트 mpm) + mod_php

Event MPM은 Apache에서만 사용하는 작업자 작업을 위한 전략으로 모든 것이 일반 스레드와 동일하지만 Keep-Alive 처리를 위한 약간의 추가 사항이 있습니다.

Keep-Alive 설정을 사용하면 클라이언트가 하나의 연결에서 많은 요청을 보낼 수 있습니다. 예를 들어, 웹페이지와 20장의 사진을 얻으세요. 일반적으로 작업자는 요청 처리를 마치고 이 연결에 대한 추가 요청이 뒤따를지 확인하기 위해 일정 시간(연결 유지 시간) 동안 기다립니다. 즉, 그것은 단지 기억에 남아 있습니다.

이벤트 MPM은 모든 Keep-Alive 요청을 기다리는 작업을 대신하여 작업자가 다른 유용한 작업을 수행할 수 있도록 하는 추가 스레드를 생성합니다. 결과적으로 이제 고객을 기다리는 사람이 없고 모두가 일하고 있기 때문에 총 근로자 수가 크게 줄어듭니다.

  • 흐름
  • 서버 내부
  • 역학
  • 깨끗한

아파치 + mod_perl

mod_perl을 사용한 Apache 연결의 특별한 기능은 Apache가 요청을 처리하는 동안 Perl 프로시저를 호출하는 기능입니다.

mod_perl은 서버와 동일한 주소 공간에서 작동하기 때문에 서버 작업의 여러 단계에서 Apache 후크를 통해 해당 프로시저를 등록할 수 있습니다.

예를 들어, mod_rewrite와 동일한 단계에서 작업하여 PerlTransHandler 후크에서 URL을 다시 작성할 수 있습니다.

다음 예에서는 Perl에서 /example을 /passed로 다시 작성하는 방법을 설명합니다.

# mod_perl PerlModule이 활성화된 Apache 구성에서 MyPackage::Example PerlTransHandler MyPackage::Example # MyPackage/Example.pm 파일에서 패키지 MyPackage::Example use Apache::Constants qw(DECLINED); 엄격하게 사용하십시오. 하위 처리기( my $r = Shift; $r->uri("/passed") if $r->uri == "/example" return DECLINED; ) 1;

불행하게도 mod_perl은 그 자체로 매우 무거우므로 재작성에만 사용하는 것은 매우 비쌉니다.

mod_php와 달리 Pearl 모듈은 지속적입니다. 즉, 매번 자체적으로 다시 초기화되지 않습니다. 이는 각 요청 전에 큰 모듈 팩을 다시 로드할 필요가 없기 때문에 편리합니다.

  • 프로세스/스레드 - MPM에 따라 다름
  • 서버 내부
  • 역학
  • 지속성 있는

꼬인

이 비동기 서버는 Python으로 작성되었습니다. 그 특징은 웹 애플리케이션 프로그래머가 직접 추가 작업자를 생성하고 작업을 제공한다는 것입니다. # 서버의 예제 코드가 꼬였습니다 # 긴 함수, 요청 처리 def do_something_big(data): .... # 요청을 처리하는 동안 d = deferToThread(do_something_big, "parameters") # 콜백을 결과 do_something_big d.addCallback(handleOK) # .. 및 do_something_big 실행 시 오류에 바인딩 d.addErrback(handleError)

여기에서 프로그래머는 요청을 받으면 deferToThread에 대한 호출을 사용하여 do_something_big 함수 실행을 담당하는 별도의 스레드를 생성합니다. do_something_big이 성공적으로 완료되면 handlerOK 함수가 실행되고, 오류가 있으면 handlerError가 실행됩니다.

그리고 현재의 흐름은 이때에도 계속될 것이다. 정상적인 처리사이.

모든 작업은 단일 주소 공간에서 이루어지므로 모든 작업자는 예를 들어 사용자와 동일한 배열을 공유할 수 있습니다. 이를 통해 Twisted에서 다중 사용자 채팅 유형 애플리케이션을 쉽게 작성할 수 있습니다.

  • 흐름
  • 서버 내부
  • 역학
  • 지속성 있는

톰캣, 서블릿

서블릿은 스레드 웹 애플리케이션의 전형적인 예입니다. 단일 Java 애플리케이션 코드는 여러 스레드에서 실행됩니다. 동기화는 필수이며 프로그래머가 수행해야 합니다.

  • 흐름
  • 서버 내부
  • 역학
  • 지속성 있는

빠른CGI

FastCGI는 일반적으로 프로세스로 시작되는 웹 서버와 외부 작업자 간의 통신을 위한 인터페이스로, 서버는 요청의 환경 변수, 헤더 및 본문을 특수한(HTTP가 아닌) 형식으로 전송하고 작업자는 응답을 반환합니다.

그러한 워커를 생성하는 방법에는 두 가지가 있습니다.

  1. 서버와 통합
  2. 서버와 분리

첫 번째 경우에는 서버 자체가 외부 작업자 프로세스를 생성하고 그 수를 관리합니다.

두 번째 경우에는 작업자 프로세스를 생성하기 위해 별도의 "생성자"가 사용됩니다. 두 번째는 FastCGI 프로토콜을 통해서만 통신하고 작업자를 관리할 수 있는 추가 서버입니다. 일반적으로 생성자는 스레드가 아닌 프로세스로 작업자를 생성합니다. 동적/정적은 스포너 설정에 따라 결정되며, 순수/지속성은 워크플로의 특성에 따라 결정됩니다.

FastCGI로 작업하는 방법

FastCGI로 작업하는 방법에는 두 가지가 있습니다. 첫 번째 방법은 가장 간단하며 Apache에서 사용됩니다.

요청 수신 -> FastCGI에서 처리를 위해 제출 -> 답변을 기다리다-> 고객에게 답변을 제공합니다.

두 번째 방법은 lighttpd/nginx/litespeed/etc와 같은 서버를 사용하는 것입니다.

요청 수신 -> FastCGI에서 처리를 위해 제출 -> 다른 클라이언트 처리-> 고객이 도착하면 답변을 제공합니다.

이러한 차이점을 통해 Lighttpd + fastcgi는 Apache보다 더 효율적으로 작동할 수 있습니다. 왜냐하면 Apache 프로세스가 기다리는 동안 Lighttpd는 다른 연결 서비스를 관리하기 때문입니다.

FastCGI 작동 모드

FastCGI에는 두 가지 작동 모드가 있습니다.
  • 응답자 - FastCGI가 요청과 변수를 수락하고 응답을 반환하는 일반 모드
  • 승인자 - FastCGI가 응답으로 액세스를 허용하거나 거부하는 모드입니다. 닫힌 정적 파일 모니터링에 편리

두 모드 모두 모든 서버에서 지원되는 것은 아닙니다. 예를 들어 Lighttpd 서버에서는 둘 다 지원됩니다.

FastCGI PHP 대 PERL

PHP 인터프리터는 스크립트를 처리하기 전에 매번 자체적으로 지워지는 반면 Perl은 다음과 같은 루프에서 요청을 하나씩 처리합니다.

모듈을 연결하십시오. while (요청이 도착했습니다) ( 처리; 응답 인쇄; ) 따라서 Perl-FastCGI는 포함 도우미 모듈이 대부분의 실행 시간을 차지하는 경우 훨씬 더 효율적입니다.

요약

기사에서는 다음과 같이 설명합니다. 일반 구조요청 처리 및 작업자 유형, 그리고 Apache Event MPM과 FastCGI 작업 방법, 서블릿 및 Twisted를 살펴보았습니다.

이 개요가 웹 애플리케이션용 서버 아키텍처를 선택하는 출발점이 되기를 바랍니다.

매일 네트워크에 연결된 컴퓨터를 사용하고 모바일 장치도 인터넷에 연결되어 있으면 모든 사용자는 때때로 "서버"라는 단어를 접하게 됩니다. 또한 이 단어는 다양한 조합으로 나타날 수 있으며 모든 사용자가 무엇을 이해하는지 이해하는 것은 아닙니다. 우리 얘기 중이야. "서버"라는 단어 뒤에는 무엇이 숨겨져 있으며, 사용자에게 이 서버가 필요한 이유는 무엇입니까?

"서버"라는 용어는 하드웨어 장치 및 이를 위한 소프트웨어(하드웨어 및 가상)를 의미할 수 있습니다. 하드웨어 서버는 별도의 컴퓨터. 다른 PC 및 사무기기의 작동을 보장하기 위해 필요합니다. 가상 서버는 소프트웨어입니다. 이 경우 특정 서버는 이 두 가지 유형을 결합합니다.

가장 먼저 기억해야 할 것은 네트워크를 관리하는 것이 아니라 네트워크와 사용자를 유지하는 것이 그 임무라는 것입니다. 사용자가 직접 서버에 작업을 제출하면 서버가 신속하게 문제를 해결합니다. 예를 들어 HP 서버와 같은 서버가 성능이 좋을수록 업무 수행 능력도 향상됩니다.

이러한 모든 장치를 하나의 네트워크로 결합하지 않고 많은 전자 장비를 설치한 대기업의 작업은 상상하기 어렵습니다. 기업의 서버를 사용하면 사무용 장비를 원격으로 제어하고 PC가 서로 상호 작용할 수 있습니다.

서버 장애 또는 오작동으로 인해 재난이 발생할 수 있습니다.

기업에서는 서버를 사용하여 모든 부서의 작업을 최적화할 수 있습니다. 그러나 또한 일상 생활우리는 종종 서버 작업에 직면합니다. 특히, 현금창구나 은행 창구 직원들은 서버를 이용해 문서를 인쇄하고 결제를 한다. 서버는 모든 메일러, 소셜 네트워크 및 커뮤니케이션 관리자를 지원합니다.

서버는 인터넷에 대한 액세스를 제공합니다. 모든 사이트는 서버에 저장됩니다. 공유 호스팅을 제공합니다. 이 서비스는 호스팅 회사에서 제공됩니다.

공유하다