Verimli bir web uygulaması birden çok yüklemesini yönetmek nasıl?

13 Cevap php

Benim deneyim, bizim webdevelopment sürecinde rastlamak büyük sorunlardan biri farklı kurulumları güncellenen ve farklı sunucular arasında güvenli tutuyor.

Benim şirket şu anda 100 + sunucuları arasında kurulu olduğu kendi CMS kullanıcısı var. Şu anda, bizim CMS kurulumları tüm yükseltmek için belirli yerlerde yükseltme komut ile birlikte bir hack-ish FTP tabanlı yaklaşım kullanın. Dahil çeşitli özel modüller olduğunda verimli bu kurulumları yönetmek giderek daha zor ve riskli olur.

  • Ne bir web uygulaması birden kurulumları tutmak için en iyi yolu güvenli ve up-to-date?
  • you bunu nasıl yapabilirim?
  • Müşterilerimize karşı esneklik, ancak hala verimli bir uygulamanın birden çok "şube" yönetmek için güçlü olmak korumak için uygulamaları modülerlik ilgili herhangi bir ipucu var mı?

Bazı bağlamsal bilgiler: biz esas AMPUL yığını üzerinde gelişir. Bizim CMS satmak yardımcı olur ana faktörlerden biri bizim müşteri istediği oldukça çok şey eklentisi olabilir. Bu çok 10 ila özel kod 10.000 hatları için olabilir.

A lot of custom work consists of very small pieces of code; managing all these small pieces of code in Subversion seems quite tedious and inefficient to me (since we deliver around 2 websites every week, this would result in a lot şube).

Ben bakan bir şey var ise, ben sizden duymak isteriz.

Şimdiden teşekkürler.


Roundup:, her şeyden önce, tüm cevaplar için teşekkürler. Tüm bu gerçekten yararlı.

Ben büyük olasılıkla benlumley 'nin çözümü ben kullanmak ne yakın kılan bir SVN-tabanlı bir yaklaşım kullanacak. Bu sorunun cevabı, diğer usecases farklılık olabilir çünkü, ben çalışmasının sonunda en çok oy alan cevabı kabul edecektir.

Please examine the answers and vote for the ones that you think have the most added value.

13 Cevap

Ben bir sürüm kontrol sistemi kullanarak ve değiştirmek zorunda kodlarının parçası sağlamlık ve verimlilik açısından en iyi yaklaşım olduğu ortaya dönüşebilir "dallanma" düşünüyorum.

Eğer ihtiyaç varsa yerel bazı değişiklikler tutarken "çekirdek" farklı "dalları" sorunsuz özellikleri güncellemek için izin açacağından, bir dağıtılmış sürüm sistemi, ihtiyaçlarınıza en uygun olabilir.

Edit: Ben bir dağıtılmış sürüm sistem ile bugüne kadar tüm bu uydurarak beklediğiniz gibi olandan çok daha az sıkıcı olacağına eminim: Eğer için asla konum emin olan değişiklikleri tutabilirsiniz başka bir yerde, yerel ihtiyaç ve dağıtılan yönü dağıtılan uygulamanın her biri aslında diğerlerinden bağımsızdır ve yaymak demek sadece düzeltme yaymak anlamına gelir.

Başvurunuzu özelleştirme kod birçok küçük değiştirilmesini içeriyorsa, bu uygulamanın tasarımı kusurlu olduğunun bir işareti olabilir. Sizin uygulama kararlı çekirdek kodunun bir dizi özel kütüphaneler şablonları kullanarak görünümünü değiştirmek için yeteneği takmak için genişletilebilirlik noktaları ve davranışlarını değiştirmek ve yapılandırma dosyalarını kullanarak eklentileri yüklemek için yeteneğine sahip olmalıdır. Bu şekilde, her müşteri için ayrı bir SVN şube gerekmez. Aksine, çekirdek kodu ve normal olarak kaynak denetiminde uzatma eklentisi kütüphaneleri tutmak. Başka bir depo, her müşteri için bir klasör oluşturun ve orada tüm şablonları ve yapılandırma dosyaları tutmak.

Şimdilik, yaratma SVN dalları aklı tutmanıza yardımcı tek çözüm olabilir. Mevcut durumda, bu bir hata ve karmaşa bir müşterinin sitesini yapacağız neredeyse kaçınılmaz. En azından dalları ile her müşteri için istikrarlı bir kod tabanı için garanti edilir. SVN dalları ile sadece yakaladım taşımak veya Şubede bir dosyayı yeniden adlandırmak, eğer (bunu elle yapmanız gerekiyor) tekrar aşağı bagaja bu değişikliği birleştirmek imkansız değildir.

İyi şanslar!

EDIT: Ben yukarıda özetlenen tüm ilkelerini kullanarak iyi tasarlanmış bir uygulama bir örnek için bkz Magento E-Commerce. Magento şimdiye kadar birlikte çalıştığım en güçlü, genişletilebilir ve özelleştirmek için kolay bir web uygulaması.

Ben yanlış olabilir, ama Aron not sürüm kontrolü sonrasında isimli bana ne gibi görünüyor. Sürüm büyük, ve ben onlar zaten bunu kullanarak emin değilim, ama özel tesisat yüzlerce güncelleştirmeleri yönetmek için, size başka bir şey gerekiyor.

Ben bir purpose-built package system satırlar boyunca bir şey düşünüyorum. Bir modülün her versiyonu bireysel bağımlılıkları ve 'garantili uyumlulukları' takip etmek istiyorum, ve otomatik olarak sadece 'güvenli' modüllerini güncellemek için bu bilgileri kullanacağız.

Örneğin Diyelim ki 'Wiki' modülün yeni bir sürümünü 3 inşa ettik diyelim. Eğer uygulamayı çalıştıran tüm sunuculara yeni sürümü yaymak istiyorum, ama sürüm 2 beri Wiki modül içinde arayüzleri birine değişiklikler yaptık. Şimdi, tüm varsayılan kurulumları için, hiçbir sorun, ama o kıracak eski arayüzü üstüne özel uzantılara sahip tesisler. İyi planlanmış bir paket sistemi bu çaresine bakardı.

Güvenlik soruya cevap için, yamalar dijital imzalar kullanarak içine bakmak gerekir. Orada açık anahtar tabanlı imzalar için mevcut iyi kütüphanelerin çok, bu yüzden sadece seçtiğiniz platformu için standart olacak gibi görünüyor ne olursa olsun gidin.

Birinin bu dedi emin olup, orada uzun yanıtları burada bir sürü var ve ben hepsini okumadım.

Ben sürüm kontrolü için daha iyi bir yaklaşım CMS, kendi depo ve kendi her proje kendi oturdu sahip olacağını düşünüyorum. (Ya da, tüm bu sanırım bir repo içinde alt klasörler olabilir)

Bunu gerektiren her projede dış: Daha sonra bir svn olarak gövde (ya da isterseniz, belirli bir dal / etiket) kullanabilirsiniz. Bu şekilde, CMS yaptığınız güncellemeleri geri depo taahhüt edilebilir ve gibi diğer projeler içine çekilecektir ve güncellenmiş (veya harici svn: Düğme 'ed) svn zaman.

Bu kolaylaştıran bir parçası olarak, external'lara svn düzgün çalışır böylece CMS ve özel işlevler, farklı klasörlerde oturup emin olmak gerekir.

IE:

project
 project/cms <-- cms here, via svn external
 project/lib <-- custom bits here
 project/www <-- folder to point apache/iis at

(Gerekirse www klasörü altında CMS ve lib olabilir)

İstediğiniz gibi bu her proje size dal / etiket izin verir. Bir şube başına / tag bazında dış yeri: Ayrıca svn geçiş yapabilirsiniz.

Değişiklikler yaşamak alma açısından, ben hemen ftp kurtulmak ve rsync veya svn checkout / ihracatını kullanmanızı öneririm. Hem de iş, seçim size kalmış.

Ben sunucuya svn ihracat rsyncing, rsync rota ile en deneyimim var. Bu rota aşağı giderseniz, bazı kabuk komut yazmak, ve bunu-n bayrağını kullanarak, hem de bunları yükleyerek olmadan upload edecek size dosyalarını göstermek için bir test kabuk komut dosyası oluşturabilirsiniz. Aslında bunu yapmak için bir test ve bir - Ben genellikle her ortam için komut bir çift kullanın.

Eğer yüklenenler göndermek için bir şifre gerekmez böylece paylaşılan anahtar kimlik de sunucu erişimi verilecek kadar güvenli bağlı olarak yararlı olabilir.

Ayrıca sadece yükseltmek istediğiniz her proje için ilgili kabuk komut dosyası çağırır toplu yükseltmeleri, yapmak için başka bir kabuk komut dosyası korumak olabilir.

Drupal baktınız mı? Hayır, dağıtmak ve ne var yerine, ama onlar özelleştirmeleri ve site-spesifik modülleri nasıl ele görmek için değil?

Temelde, hosting konum her site için bir dizin olan bir "siteler" klasörü var. Her klasör içinde farklı bir veritabanı belirtmek sağlayan ayrı bir settings.php olduğunu. Son olarak, (isteğe bağlı) siteleri içinde "temaları" ve "modüller" klasörler olabilir.

Bu, belirli modüllerin site-spesifik özelleştirmeleri yapmak ve bu sitelerde bazı modüller sınırlamak için olanak sağlar. Sonuç olarak, her şeyin büyük çoğunluğu mükemmel özdeş ve yalnızca farklar çoğaltılamaz almak bir site ile sonuna kadar. Bu yükseltmeleri ve güncellemeleri kolları ve canlı bir model olabilir yolu ile bu birleştirin.

Build into the code a self-updating process.
It will check for updates and run them when/where/how you have configured it for the client.

Sen roll-out öncesinde yeni yapı ile test edilmesi gerekir modülleri (özel veya değil) bir listesinin çeşit oluşturmak zorunda olacak. Bir güncelleme dağıtırken bu test ve doğru entegre sağlamak zorunda olacak. Umarım tasarımı bu işleyebilir.

Güncellemeler ideal birkaç önemli adım vardır.

  1. a) Backup so you can back out. You should be able to back out the entire update at any time. So, that means creating a local archive of the application and database first.

    b) Update Monitoring Process - Yeni bir yapı aramak için CMS sistemi telefon ev var.

    c) Schedule Update on availability - Şansını güncelleme mevcut olduğu ikinci çalıştırmak istemiyorum vardır. Bu gecenin ortasında otomatik olarak sistem güncellemesini yapmak için bazı tür bir cron / ajan oluşturmak zorunda anlamına gelir. Ayrıca hafta sonları, ya da belirli günlerde güncellemek için müşteri gereksinimlerini düşünebilirsiniz. Ayrıca 1 gün 1000 istemcileri güncellemek ve teknik destek cehennem alamadım böylece güncellemeleri yayıyoruz bocalama. Çeşit sendeleyerek roll-out sizin için yararlı olabilir.

    d) Add maintenance mode to update the site - bakım moduna siteyi Kick.

    e) SVN checkout or downloadable packages - ideal svn kasada yoluyla dağıtabilir, ve değilse, kurulum svn sunmak için sunucu istemci sitelerinde dağıtılabilir bir arşiv haline paketlerini oluşturulur.

    f) Deploy DB Scripts - Yedekleme veritabanları, onları güncelleme, onları doldurmak

    g) Update site code - Bir adım Tüm bu çalışmalar.

    kod inşa self-test varsa h) Run some tests on it., ideal olacaktır.

Kişi zaten sürüm denetimi (I nedeniyle işlevselliği için Subversion'da tercih) ve dallanma kullanarak en iyi seçenek olacağını belirtmiştik. CruiseControl denilen sourceforge mevcut başka bir açık kaynak yazılım. Onun şaşırtıcı, sen Sach subversion ile herhangi bir kod değişikliği veya yeni kod serversion eklenen bir şekilde CruiseControl yapılandırmak, Cruise control otomatik olarak bilecek ve sizin için inşa yapacağız. O zaman sizin cehennem kazandıracak.

Benim şirkette aynı şekilde yaptım. biz dört projeler var ve farklı sunucular üzerinde bu projeyi dağıtmak zorunda. Ben kod tabanı herhangi bir değişiklik otomatik yapı tetikler böyle bir şekilde kurulum cruiseconrol var. ve başka bir komut dosyası sunucu üzerinde bu yapı dağıtmak olacaktır. senin gitmek iyidir.

Eğer bir lamba yığını kullanırsanız ben kesinlikle bir dağıtım paketinin içine çözümler dosyaları açmak ve Propagate değişiklikler için kullanmak istiyorsunuz. Çünkü RPM bu konuda Redhat / Fedora için tavsiye ve ben deneyim ne var. Neyse siz de herhangi bir Debian tabanlı dağıtım kullanabilirsiniz.

Bazen önce ben bir ISP barındırma sunucularını yönetmek için bir lamba çözüm oldu. Onlar web hosting dikkat çekmek için birden çok sunucu vardı ve her makine kendi kendine yeten ve bir çevrimiçi yöneticisi vardı, çünkü benim yönetici değişiklikleri dağıtmak için bir yol gerekli. Ben çözüm dosyaları (php çoğunlukla) ve RPM ile yürütüldü bazı dağıtma komut dosyalarını içeren bir RPM paketi yaptı.

Otomatik güncelleştirme için biz yum.conf her sunucuda ayarlanmış kendi RPM depo vardı. O güvenilen deposundan son RPM günlük sunucularını güncellemek için bir crontab iş ayarlayın.

Eğer ortak anahtar dosyası ile bunları imzalamak ve yalnızca imzalı paketlerini kabul gibi, RPM paketleri güven ayarları kullanabilirsiniz çünkü Trustiness da elde edilebilir.

Hm bu yapılandırma dosyaları eklemek için bir fikir olabilir? Sen küçük komut bir çok şey yaptığını yazdı. Eğer kaynaklar içine inşa ve yapılandırma dosyaları ile bunları kumanda ediyorum Şimdi eğer o "kolay" değil ki?

Öte yandan, her müşteri için şube olan bana bir üstel büyüme gibi görünüyor. Ve nasıl bir şey yaptık ve diğer tüm branşlarda değişiklik "yapmak" için unutma hangi alanlarda "bilmek" olurdu. Bu bana oldukça çirkin görünüyor.

Bu revizyon kontrolleri, yapılandırma seçenekleri ve / veya dağıtım makbuzların bir arada bir "iyi" bir fikir gibi görünüyor görünüyor .....

Çekirdek yazılım birçok varyasyonları ile, ben gerçekten bireysel müşteri sitelere gövde güncelleştirmeleri iterek üstünde kalmak için bir sürüm kontrol sistemi gerekir düşünüyorum.

Subversion'un sıkıcı olacağını düşünüyorsanız Yani, ağrı noktaları ne olacağını iyi bir duygusu var gerçekten yönetme ve en iyi değil çünkü ... Şahsen ben, bunun için Subversion tavsiye etmem şube izleme. Çekirdek yazılım için Externals kullanmak benlumley önerisi iyi biri olmasına rağmen, sizin müşteri siteler için çekirdek kod çimdik gerekiyorsa, bu ayırır.

Sürüm kontrolü için Git içine bak, bu dallanma için inşa, ve hızlı oluyor.

Lütfen dağıtımları yönetmek için Capistrano göz atın. Genellikle Rails ile kullanılan bir yakut script, ama uzak sunuculara, hatta olmayan yakut sitelerde dosya yönetimi her türlü kullanılabilir. Bu ftp, scp, rsync, yanı sıra otomatik deposundan son sürümünü kontrol dahil olmak üzere çeşitli stragegies aracılığıyla uzaktan sonuna içerik alabilirsiniz. Sembolik üzerinden yapılır - - güzel bu (sürüm kontrolü olmayabilir sitenize özgü konfigürasyon dosyalarını kopyalayabilir, örneğin), ve bir bırakma günlüğü sistem açılma sürecinin her adımı için geri kancalar vardır sağlar özellikleri böylece hızla geri sorun durumunda bir önceki sürüme dönebilirsiniz.

Daha sonra sırayla her dalı denetler ve son değişiklikleri yükler bir komut dosyası ile bu koşuyoruz, şube listesi ve onların ev sahipliği konumu ile bir yapılandırma dosyası tavsiye ederim. Bu otomatik gece güncelleştirmeleri yapmak için cron'd olabilir.

İşte benim yaptığım şey ...

Client-specific include path

  • Paylaşılan ortak kod shared/current_version/lib/ içinde
  • Site özel kodu clients/foo.com/lib içinde
  • Içeren yol clients/foo.com/lib den içerecek şekilde ayarlanmış, ve sonra share/lib edilir
  • Her şey bir versiyon kontrol sistemi olduğunu

Bu kod paylaşılan dosyaları mümkün kullanmasını sağlar, ama nedense belli bir sınıf veya dosya geçersiz gerekiyorsa, ben kendi klasöründe bir istemci belirli bir sürümünü yazabilirsiniz.

Alias common files

Benim sanal konak yapılandırması gibi bir satır içerir

Alias /common <path>/shared/current_version/public_html/common

Ortak UI öğeleri, simgeler, vb projeler arasında paylaşılmasını sağlayan

Tag the common code with each site release

Her site yayımlanmasından sonra, etkili bir zaman içinde bu noktaya dondurmak için bir şube oluşturarak ortak kod etiketlemek. Bu beni canlı sunucuya / paylaşılan / version_xyz / dağıtmak sağlar. Sonra bir sanal konak ortak dosyaları belirli bir sürümünü kullanın, ya da ben son güncellemeleri almak istiyorsanız current_version işaret bırakabilirsiniz.

Böyle Puppet (sistem yönetimi dahil için. App dağıtım) veya Capistrano (RubyOnRails apps dağıtım ancak bunlarla sınırlı değildir) gibi araçlar baktınız mı?

Bir seçenek salt okunur sürüm kontrol sistemi (Subversion) kurmak olacaktır. Eğer kullanıcı bir güncelleme (kritik olabilir) hakkında bir seçim yapmak istemiyorsanız otomatik olarak CMS içine depo erişimi entegre ve bir menü aracılığıyla güncelleştirmeleri çağırmak, ya da olabilir. Bir sürüm kontrol sistemi kullanarak da kolayca farklı dalları tutmak için izin verecek