2009-11-02 12 views
7

Stworzyłem aplikację internetową PHP.Jak przenieść mój kod z dev do produkcji?

Mam 3 środowiska: DEV, TEST, PROD.

Co jest dobrym narzędziem/praktyką biznesową dla mnie, aby przenieść mój kod aplikacji PHP z DEV do TEST do środowiska PROD?

Uświadomienie sobie, że moje środowisko TEST nadal łączy się tylko z moją bazą danych TEST; mając na uwadze, że muszę PROD środowisko, aby połączyć się z moją bazą danych PROD. Tak więc kod jest głównie taki sam, z tym wyjątkiem, że muszę zmienić mój kod TEST po przeniesieniu do PROD, aby połączyć się z bazą danych PROD, a nie bazą danych TEST.

Słyszałem o ludziach, którzy usunęli Apache w taki sposób, że nie pozwala on na nowe połączenia, a gdy wszystkie istniejące połączenia są bezczynne, po prostu obniża serwer WWW.

Następnie ludzie ręcznie skopiuj kod, a następnie ręcznie zaktualizuj pliki konfiguracyjne aplikacji PHP, aby również wskazywały na wystąpienie PROD.

To wydaje się strasznie niebezpieczne.

Czy istnieje najlepsza praktyka?

+0

Właśnie się dowiedziałem, że Teddy wydaje się być nieobecny :-) Pytanie tsi zostało zadane 5 miesięcy temu, więc prawdopodobnie nie przyjmie odpowiedzi. Jest to niezły wątek. – user89021

Odpowiedz

3

Skorzystaj z plików konfiguracyjnych, aby określić bazę danych, z którą się łączysz. Oznacza to, że plik konfiguracyjny DEV, plik konfiguracyjny TEST i plik konfiguracyjny PROD. Ogólnie jest to najlepszy sposób na uniknięcie kosztownych i frustrujących błędów.

+0

Jak migrować kod? Po prostu go kopiujesz? – Teddy

+1

Tak. Celem projektu jest umożliwienie uruchomienia kodu w dowolnym środowisku, z plikami konfiguracyjnymi opisującymi różnice w każdym środowisku. – mob

1
  1. Mieć swój kod w systemie kontroli wersji (wolę Subversion (svn)). Ułatwia to utrzymanie zsynchronizowanych środowisk DEV, TEST i PROD, dzięki czemu nie trzeba śledzić zmodyfikowanych plików. Gdy jesteś zadowolony ze swoich modyfikacji na DEV, zatwierdzasz zmiany w svn, a następnie uruchamiasz "aktualizację svn" w TESTU i ostatecznie po przetestowaniu na serwerze PROD. Większość dostawców hostingu linuksowego ma zainstalowanego klienta svn lub możesz go zainstalować samodzielnie.

  2. Nie podoba mi się posiadanie innej wersji pliku konfiguracyjnego dla każdej witryny, ponieważ wymaga ręcznej zmiany nazwy jednego pliku i usunięcia dwóch pozostałych. Preferuję konfiguracje DEV, TEST i PROD w tym samym pliku konfiguracyjnym. W pliku konfiguracyjnym ustalam, na którym serwerze działa kod, sprawdzając nazwę hosta lub adres URL żądania. Wtedy mogę mieć instrukcję "if" lub "switch", która ładowałaby ustawienia konfiguracyjne na podstawie tego, na którym serwerze aktualnie działa kod.

  3. Może być również potrzebna synchronizacja struktury bazy danych między serwerami. Używam sqlyog do tego celu, ma wbudowane narzędzie do synchronizacji struktury bazy danych, które porównuje 2 struktury bazy danych i przygotowuje SQL do ich synchronizacji.

3

W rzeczywistości nie widzę żadnego powodu, dla którego środowisko TEST powinno w cudowny sposób migrować do PROD bez zamykania serwerów. Produkcja TEST ma służyć do celów testowych. I nawet jeśli faktycznie TESTUJESZ na serwerze produkcyjnym, zanieś go (zamknij apache), zmień jedną linię w głównym pliku konfiguracyjnym, który określa, który zestaw mniejszych plików konfiguracyjnych do użycia) i wywołaj go ponownie (uruchom apache). Zajmie to nie więcej niż 1-3 minut, a ponieważ na pewno nie będziesz tego robić dwanaście razy dziennie, wszystko będzie dobrze.

6

1) Oddzielna konfiguracja od reszty kodu. Reszta kodu powinna następnie działać we wszystkich 3 lokalizacjach bez modyfikacji.Typowy plik konfiguracyjny może być:

<? 
$db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="example.com"; 
$htroot = "/var/www/prod/htdocs" 
?> 

A dla środowiska testowego:

<? 
$db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="test.example.com"; 
$htroot = "/var/www/test/htdocs" 
?> 

nie zawierają pliki konfiguracyjne z haseł w bazie kodu. Baza kodów może być kopiowana za pośrednictwem niezabezpieczonych połączeń lub przechowywana później na serwerach stron trzecich (patrz poniżej). A może nie chcesz używać haseł na wszystkich dyskach zapasowych kodu.

Można też utworzyć jeden plik konfiguracyjny i użyć przełącznika w zależności od środowiska kod zjazdowe:

<? 
$site = $_SERVER["HTTP_HOST"]; 

if ($site == "example.com";) { 
    $db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
    $htroot = "/var/www/prod/htdocs"; 
} 
if ($site == "test.example.com") { 
    $db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
    $htroot = "/var/www/test/htdocs"; 
} 
?> 

Ale teraz można ulec pokusie, aby umieścić go z powrotem do bazy kodu, która jest mniej bezpieczne jak wyjaśniono powyżej. A jeśli go tam nie umieścisz, musisz zaktualizować 3 pliki lub użyć jednej stałej lokalizacji na serwer i musisz upewnić się, że kod znajdzie plik na każdym serwerze. Osobiście preferuję rozwiązanie z jednym plikiem na witrynę z góry.

2) Masz już "wersje". Jest jedna wersja uruchomiona na prod teraz. Nadaj mu unikalną nazwę i numer, które już nigdy się nie zmienią. Możesz użyć tej nazwy wersji podczas tworzenia kopii zapasowej kodu i kiedy odwołujesz się do wersji lub kiedy ją przenosisz, gdzieś nazywasz podkategorię, która będzie zawierała ją po wersji.

Wersja, którą można umieścić w praktyce w niedalekiej przyszłości, to inna wersja, a jeśli wprowadzisz zmiany ponownie, jest to również inna wersja.

Reguła: zwiększ liczbę wersji podczas przenoszenia lub eksportowania kodu, wymiany lub aktualizacji między lokalizacjami, podczas tworzenia wersji demonstracyjnej oraz po każdej funkcji lub etapie i za każdym razem, kiedy to robisz pełna kopia zapasowa.

Należy pamiętać, że pliki konfiguracyjne (3, jeden dla prod, test i dev) NIE są częścią wersji. Możesz więc "przenieść wersje", ale nie pliki konfiguracyjne. Jeśli możesz, umieść pliki konfiguracyjne na zewnątrz drzewa wraz z resztą kodu, więc nie musisz ich rozdzielać i zachować ostrożność podczas poruszania się po wersjach później. Możesz przenieść katalog konfiguracyjny "w górę" i uzyskać do nich dostęp z następujących plików:

"include ../config.php";

3) Jeśli chcesz korzystać z systemów kontroli wersji, wykonują świetną robotę, ale potrzeba trochę czasu, aby się do niej przyzwyczaić i jeśli spieszysz się z aktualizacją, to nie jest właściwy czas, aby zacząć żyć z tym teraz. Ale chciałbym, aby w przyszłości zalecano stosowanie systemu kontroli wersji rozproszonej najnowszej generacji. Distributed oznacza, że ​​nie musisz konfigurować serwera i wiele więcej korzyści. Wymienię bazar, jeśli jest to konieczne, aby zaktualizować przez FTP może to zrobić. Należy pamiętać, że system kontroli wersji sprawia, że ​​bardzo szybka jest wymiana wersji, ponieważ zapisywane są tylko różnice między wersjami. Bazar ma społeczność i dokumentację, która ułatwia rozpoczęcie. Istnieje również Git, który ma najbardziej aktualną komercyjną stronę hostingową: http://github.com. Możesz przeglądać kod w trybie online i porównywać wersje i istnieje wiele bardziej przydatnych funkcji, nawet jeśli jesteś jedynym programistą, ale w grupie jest jeszcze lepiej. Wybór między systemami nie jest łatwy. Nie mogę polecić CVS, który jest nieaktualny. Również SVN nie jest najnowszą generacją rozproszonego systemu kontroli wersji, nie polecałbym go używać, jeśli nie ma konkretnego powodu, i będzie zanieczyszczał wszystkie swoje podkatalogi specjalnymi podkatalogami, co może być denerwujące. Dla peolple'a, który jest do tego przyzwyczajony i już się w nim koduje, jest w porządku, ale na początek powiedziałbym, że nie.

Istnieje również Mercurial i Darcs wśród rozproszonych i otwartych systemów kontroli wersji źródłowych. Mercurial ma również świetną witrynę komercyjną do współpracy i podglądu kodu online (http://bitbucket.org).

4) Jeśli nie korzystasz z systemu kontroli wersji, możesz skorzystać z linków symlink?

Możesz mieć katalog na serwerze src/versions/somewhere i umieścić tam nazwane wersje, każda w swoim własnym podkatalogu. Będziesz tylko dodawać wersje (ponieważ istniejąca wersja nie zostanie zmieniona, jeśli zmienisz ją, staje się nową)

Możesz mieć src/versions/v001/src/versions/v002/src/versions/v003/lub jakikolwiek schemat nazewnictwa, którego używasz.

Teraz tutaj jest trick:/var/www/prod/htdocs jest dowiązaniem do src/Versions/v001/

Po uaktualnieniu do V002 po prostu wykonaj następujące czynności:

  • zamykania apache
  • usunąć stare symlink/var/www/prod/htdocs (w tym momencie Webroot apache nie ma!)
  • stworzyć nowe dowiązanie symboliczne/var/www/prod/htdocs jest link do src/wersji/v002
  • s Tarta apache

Można także napisać scenariusz do tego parametry i nazwać tak:

upgrade-web prod 002 

To sprawia, że ​​luka nawet krócej.

Czasami trzeba zrobić "awarię", kiedy dowiadujesz się, że nowa wersja ma błędy w produkcji i musisz wrócić. To byłoby łatwe (ponieważ nie usuwamy starych katalogów, po prostu zatrzymujemy apache, usuniemy dowiązanie symboliczne i ponownie utworzymy je w poprzedniej lokalizacji, w tym przypadku src/versions/v001)

A jeśli test i dev znajduje się na tym samym serwerze, możesz oczywiście również dowiązać te same katalogi, więc nie byłoby żadnego ruchu ani kopiowania.

5) Jeśli robisz to ręcznie bez dowiązań symbolicznych, dlaczego nie przenieść zamiast skopiować?

(gdy pliki nie są jeszcze na tym samym serwerze, można skopiować je gdzieś w pobliżu, a następnie uruchomić z migracją, więc nie trzeba się zatrzymać serwer na taki czas ling)

Jeśli istnieje kilka katalogów na poziomie głównym projektu, które można przenieść jeden na raz. Pamiętaj, aby NIE PRZENOSIĆ plików konfiguracyjnych. Albo znajdź jakąś strategię, która przyniesie im bakc.Workflow byłoby:

  • Zatrzymaj apache
  • Odsuń się wszystkie aktualne katalogi prod i pliki na poziomie głównym wyjątkiem pliku (ów) config
  • przenieść wszystkie nowe katalogi prod i pliki do głównego poziomu wyjątkiem pliku konfiguracyjnego (s)
  • start apache

6) starają się znaleźć dla siebie indywidualny układ plików i katalogów oraz doskonałą pracę. To może zająć trochę czasu i trochę myślenia, ale to się opłaca. Zrób to na kartce, aż znajdziesz najlepsze rozwiązanie. Może to oznaczać, że będziesz musiał zreorganizować swój kod i zmienić pliki konfiguracyjne serwera, ale w przyszłości twoje życie będzie łatwiejsze, gdy wykonasz administrację i uaktualnienia. Z mojego doświadczenia: nie czekaj tak długo z tym krokiem. Twój układ powinien sprawić, że uaktualnienie będzie łatwe i bezpieczne. Aktualizacja nie jest nadzwyczajna, jest rutynowa i powinna być bezpieczna i prosta.

7) Jeśli nazywasz swoje serwery i stacje robocze (system operacyjny serwera to linux, ale czy jest to hostowany lub główny serwer, czy masz dostęp do ftp, a także dostęp do shella (ssh), czy sftp? gdzie się rozwijasz, na komputerze z systemem Windows lub mac?), wtedy ludzie mogą wymieniać narzędzia do kopiowania i przenoszenia. Co ciekawe: czy serwer testowy i serwer dev to ta sama maszyna, jeśli nie, to w jaki sposób są połączone, czy nie są? Jeśli nie, możesz wykonać transfer w 3 kierunkach (skopiuj go do lokalnej stacji roboczej, a następnie do serwera).

8) Zastanów się nad uprawnieniami do plików. Jeśli przenosisz pliki lub je kopiujesz, być może uprawnienia do plików zmieniają się, a jeśli aplikacja zależy od niektórych z nich, powinna istnieć możliwość sprawdzenia i zmiany. Przykład: Niektóre aplikacje wymagają zapisywalnych katalogów, w których umieszczane są przesłane pliki lub pliki sesji lub buforowanie szablonów. Inne aplikacje nie zezwalają na zapisywanie niektórych plików w celu zabezpieczenia.

+0

Kod, który opiera się na HTTP_HOST jest w tym formularzu niezabezpieczony. Parametr HTTP_HOST jest równy nagłówkowi 'Host:' wysłanemu przez klienta. Można to łatwo sfałszować, a jeśli HTTP_HOST nie pasuje do 'example.com' lub' test.example.com', zmienne '$ db' i' $ htroot' ** będą niezdefiniowane **. – Lekensteyn

0

Kiedy przesyłamy aktualizacje na żywo, często nie musimy restartować Apache. To może być efekt uboczny braku witryn o dużym natężeniu ruchu (< 1M pagedraws miesięcznie).

Mamy 3 gałęzie, dla różnych etapów rozwoju/QA: alpha (krawędź krwawienia, ale dostępna do oglądania przez osoby niebędące deweloperami i testerami), beta (nieco zamrożona dla konkretnego wydania, końcowa faza QA) i na żywo (produkcja).

Aby przeprowadzić migrację z jednej gałęzi do drugiej, dokonujemy scalenia między słowami alpha i beta, zatwierdzaj scalenie. Następnie uruchom skrypt wdrażania, który aktualizuje gałąź z SVN na naszej maszynie programistycznej, a następnie rsync koduje serwery sieciowe do głównego katalogu dokumentów beta.

Jak już wspomniano, każda gałąź może zawierać własny plik konfiguracyjny z odpowiednimi ustawieniami, aby uwzględnić różnice środowiskowe.

Jesteśmy w trakcie migracji do git, aby wygładzić proces scalania gałęzi, co może być trochę traumatyczne w SVN dla dużych projektów/wydań.