C+CGI+MySQL+Apache - skrypty nie działają poprawnie.

0

Witam,

muszę napisać projekt w C, który będzie obsługiwał MySQL. Jako, że nie przepadam za winapi, a także nie chciałem korzystać z gotowych komponentów np. wxWidgets, lub borlandowskiego buildera, postanowiłem napisać swój projekt w postaci skryptu cgi z wykorzystaniem formularzy html.

Po kilku dniach udało mi się w końcu skompilować prosty program w wxDev-C++ przy pomocy kompilatora GCC, z użyciem bibliotek libmysql i cgi-util. Niestety, kiedy wrzucam go na mój serwer apache, nie zawsze działa poprawnie. Jeśli w kodzie pojawia się funkcja mysql_real_connect(), która nawiązuje połączenie z baza danych, skrypt się nie uruchamia. Problem nie występuje jednak, gdy wspomnianej funkcji nie ma, chociaż w kodzie pojawia się inna funkcja z tej biblioteki - mysql_get_client_info() - wyświetlająca wersje klienta MySQL.

Przykład kodu:

#include <stdio.h>
#include <stdlib.h>
#include "cgi-util.h"
#include <windows.h>
#include <winsock.h>
#include <mysql.h>
 
int main(void)
{
 MYSQL *conn;
 int res;
 int i;
 
  /*conn=mysql_init(NULL);*/
  res=cgi_init();
  printf("Content-type: text/html\n");
  printf("\n");
  printf("Wersja mysql %s",mysql_get_client_info());
  printf("<h1>Hello World</h1>\n");
  /*if (mysql_real_connect(conn,"localhost","aartek","123456","test",0,NULL,0))
    printf("Polaczylem z baza danych");*/    
  printf("%s\n",cgi_getentrystr("imie"));  
   
  cgi_quit();
  
  return 0;
} 

Powyższy kod wyświetla się poprawnie. Natomiast po od komentowaniu lini z mysql_init() i mysql_real_connect() przestaje działać, Apache wyświetla błąd Internal Server Error, a jego logi wyglądają nastepująco:

[Sun Aug 07 1340 2011] [error] [client 127.0.0.1] Premature end of script headers: C7v1.cgi, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1324 2011] [error] [client 127.0.0.1] Premature end of script headers: C7v1.cgi, referer: http://localhost/cgi/

Problem leży w kodzie, konfiguracji serwera czy w bibliotekach? Co zrobić, żeby to zadziałało?
Dodam jeszcze, że w konsoli działa poprawnie i połączenie z bazą zostaje nawiązane.

Załączam paczkę z instrukcją, bibliotekami i nagłówkami potrzebnymi do skompilowania projektu MySQL+CGI w wxDev-C++ lub Dev-C++:
http://dl.dropbox.com/u/5532105/cgi_mysql.rar

gg:6221487

0
aartek napisał(a)

Powyższy kod wyświetla się poprawnie. Natomiast po od komentowaniu lini z mysql_init() i mysql_real_connect() przestaje działać, Apache wyświetla błąd Internal Server Error

Apache zwraca status 500 w przypadku, gdy CGI wyjdzie z kodem błędu, albo zostanie ubite przez system (np. błąd segmentacji).

<quote=aartek>a jego logi wyglądają nastepująco:

[Sun Aug 07 1340 2011] [error] [client 127.0.0.1] Premature end of script headers: C7v1.cgi, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1323 2011] [error] [client 127.0.0.1] client denied by server configuration: C:/httpd-2.2-x64, referer: http://localhost/cgi/
[Sun Aug 07 1324 2011] [error] [client 127.0.0.1] Premature end of script headers: C7v1.cgi, referer: http://localhost/cgi/

"Premature end..." - CGI się odpaliło, ale zakończyło jeszcze na etapie wysyłania nagłówków.
"client denied..." - próbujesz się dobrać do katalogu, do którego konfiguracja Apache nie zezwala na dostęp (regułki <Limit>)

aartek napisał(a)

Problem leży w kodzie, konfiguracji serwera czy w bibliotekach?

Na mój gust w kodzie i konfiguracji serwera.

aartek napisał(a)

Co zrobić, żeby to zadziałało?

Zdebugować i poprawić.

aartek napisał(a)

Dodam jeszcze, że w konsoli działa poprawnie i połączenie z bazą zostaje nawiązane.

Konsola to nieco inne środowisko. Np. CGI może być odpalane na uprawnieniach innego konta. Wygląda to tak, jakby Twoje CGI z jakiegoś powodu się wywracało. Musiałbyś przetestować z zainicjowanymi zmiennymi środowiskowymi itp... czy jak to tam pod Windows jest robione.

0

A czy potrafisz mi wskazać ten błąd w kodzie? I czy może wiesz, co dokładnie mam zmienić w konfiguracji apache, bo ja niestety się w tym nie orientuję.

0

Ja miałem ostatnio duży problem z segfaultem libmysql podczas wykonywania funkcji mysql_fetch_row po losowej ilości wywołań, tzn. przy danej kompilacji zawsze po tej samej ilości wierszy, ale różnej w zależności od optymalizacji i zawartości pętli (bez zmiany odwołań do mysqla). Objawiało się to przy używaniu przerobionej dllexport oryginalnej biblioteki oraz przy użyciu paczki pod wxDev (nie flame'ujcie, instalowałem go tylko do sprawdzenia), nie chciało mi się tego kompilować, ze względu na konieczność instalacji boosta (i nie sądzę, żeby to poszło tak samo bez problemów, jak przez apta). Dokładnie ten sam kod działał pod linuksem bez żadnych kłopotów. Radzę ci sprawdzić to pod linuxem/MSVC.
Pamiętam też jak kiedyś korzystałem z mysql++ pod windowsem. Wszystko działało bez kłopotu, tylko że wyrzucał mi segfaulta w destruktorze przy zamykaniu programu.

0
aartek napisał(a)

A czy potrafisz mi wskazać ten błąd w kodzie? I czy może wiesz, co dokładnie mam zmienić w konfiguracji apache, bo ja niestety się w tym nie orientuję.

Sorry, to trzeba zdebugować, a ja nie używam Windows.
Jedyne miejsce, gdzie według mnie może występować błąd w kodzie, to wywołanie mysql_init(). Nie sprawdzasz czy się powiodło. Zapewne w przypadku błędu zwraca NULL i wszelkie późniejsze odwołania używające conn w takim przypadku będą wylatywać. Reszta wygląda dobrze, więc bez debugowania się raczej nie obędzie.

0

A czy może być tak, że skrypt nie uruchamia się na serwerze, bo brakuje mu tam biblioteki libmysql.dll?
Jeśli tak, to co i jak muszę z tym zrobić?

0
aartek napisał(a)

A czy może być tak, że skrypt nie uruchamia się na serwerze, bo brakuje mu tam biblioteki libmysql.dll?

Zaraz... To wreszcie sprawdzałeś "z palca" czy nie?

aartek napisał(a)

Jeśli tak, to co i jak muszę z tym zrobić?

Zainstalować.

0

Teraz skompilowałem projekt w Visual Studio i aby uruchomić program, w folderze musi być libmysql.dll. Wcześniej kompilowałem przy pomocy gcc i libmysql.dll nie był potrzebny.
Teraz jak wrzucam plik .cgi na serwer, to ładuje w nieskończoność. Apache pokazuje tylko:

[Tue Aug 09 1600 2011] [error] [client 127.0.0.1] Script timed out before returning headers: mysql4_9-08-11 (2).cgi, referer: http://localhost/cgi/

Kod programu:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <WinSock.h>
#include <mysql.h>
#include "stdafx.h"
#include "cgi-util.h"
#pragma comment (lib,"libmysql.lib")

int main(int argc, char* argv[]){

	MYSQL *conn;	

	printf("Hello World\n");
	printf("Wersja mysql to: %s\n",mysql_get_client_info());

	conn=mysql_init(NULL);
	if (!mysql_real_connect(conn,"localhost","aartek","123456","test",0,NULL,0))
		printf("%s\n",mysql_error(conn));
	
	system("PAUSE");
	return 0;

}

Mój plik cgi: http://dl.dropbox.com/u/5532105/mysql4_9-08-11.cgi
libmysql.dll: http://dl.dropbox.com/u/5532105/libmysql.dll
Projekt Visual Studio: http://dl.dropbox.com/u/5532105/mysql4_9-08-11.rar

i jeszcze plik cgi skompilowany w gcc: http://dl.dropbox.com/u/5532105/C7v1.cgi

Jak zainstalować bibliotekę na serwerze?

0

system("PAUSE") w cgi? Nic dziwnego że timeoutuje... Poza tym wyjściem programu działającego jako CGI powinna być pełna odpowiedź HTTP, przykładowo najprostszy

HTTP/1.0 200 OK

Hello!

(apache, gdy nie dostanie poprawnej odpowiedzi HTTP, to CHYBA opakowuje w swoje nagłówki).

0

faktycznie.. Głupota z tym system("PAUSE"). Teraz skompilowane gcc działa :)
Co najlepsze, dziś skompilowany program z pierwszego postu również działa... \

W każdym razie, wygląda na to, że póki co wszystko jest okej.
Dziękuję za pomoc.

I jeszcze jedno, czy ktoś z Was podłączył bibliotekę cgi-util do Visual Studio? A może macie jakąś inną działającą bibliotekę wspierającą cgi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1