Nginx가 URL에 대한 요청을 받을 때마다 (컴파일된) C 프로그램을 실행하고 싶습니다.https://myserver.com/programs/my-C-file.
더 구체적으로 말하면, GitHub의 PR이 병합될 때 C로 작성된 사용자 지정 빌드 및 릴리스 프로세스를 시작하는 후크가 필요합니다. (빌드 프로세스가 복잡하기 때문에 C를 사용하고 싶습니다. 단계가 많고 stdout을 구문 분석하는 것이 더 쉽습니다. Bash나 PHP보다 C에서요.)
하지만 PHP 파일 대신 C 바이너리를 직접 트리거하기 위해 FastCGI를 사용해야 하는 이유가 있나요 exec('my C program')
?
분명히 며칠에 한 번씩 이러한 항목을 몇 개 이상 얻지 못하므로 확장에 대해 걱정하지 않으며 FastCGI는 추가 구성이 많은 것 같지만 PHP는 즉시 사용할 수 있습니다. PHP 파일을 실행 exec()
하고 Nginx에서 블록을 생성하기만 하면 됩니다.
아니면 이 모든 과정이 잘못되었다고 생각하고 더 쉽게 할 수 있는 방법이 있을 수도 있습니다.
답변1
예, nginx와 FastCGI를 사용하여 C 바이너리를 실행할 수 있습니다. 필요한 단계에 대한 대략적인 개요는 다음과 같습니다.
- nginx 설치
- 스폰-fcgi 설치
- fastcgi 데이터베이스 설치(선택 사항)
- IP/도메인을 수신하는 서버와 FCGI 업스트림을 로컬 호스트/포트로 보내는 위치를 사용하여 nginx 가상 호스트 구성을 만듭니다.
- C 프로그램을 컴파일하십시오(프로그램에는 가 포함되어야 함
while (FCGI_Accept() >= 0) { }
). - 귀하의 프로그램에 대한 래퍼로 localhost/port를 수신하기 위해spawn-fcgi 프로세스를 시작하십시오.
더 읽어볼 내용:
답변2
두 가지 가능한 솔루션:
Python의 CGIHTTPServer를 사용하십시오. 구성할 필요가 없습니다. 컴파일된 프로그램을 디렉토리에 넣고 상위 디렉토리에서
cgi-bin
시작하면 됩니다 .python -m CGIHTTPServer
path 에서 프로그램을 호출할 수 있습니다/cgi-bin/yourprogramname
. 이것은 이미 작동 중인 HTTP 서버입니다. Nginx를 앞에 두고 싶다면 간단한 역방향 프록시로 구성하세요(proxy_pass이면 충분합니다).Apache의 기본 CGI 지원을 사용하십시오. 나는 당신에게 참고할 것입니다아파치의 문서구성의 경우 디렉터리 구조는 첫 번째 옵션과 동일합니다.
C가 아닌 Go와 같은 언어를 사용하면 이동 조각의 양을 줄일 수도 있습니다. 실제 빌드 프로세스를 실행하는 함수를 호출할 수 있는 10줄 정도의 Go에서 HTTP 서버를 작성할 수 있기 때문입니다.