2011-12-16 9 views
6

हम बातें करते हैं कैसे अबएक सुरक्षित तरीका PHP कोड को तैनात करने के

हम एक फ़ाइल सर्वर है (एनएफएस का प्रयोग करके) जो एक से अधिक वेब सर्वर माउंट और वेब रूट के रूप में इन माउंट का उपयोग के लिए देख रहे हैं। जब हम अपने कोडबेस को तैनात करते हैं, तो हम एनएफएस सर्वर पर एक संग्रह (tar.gz) एससीपी करते हैं और सीधे डेटा सर्वर की "वेब निर्देशिका" में डेटा को अनारक्षित करते हैं।

मुद्दा

तैनाती की प्रक्रिया के दौरान हम कुछ आई/ओ त्रुटि मिल रही हो, ज्यादातर जब एक अनुरोध की गई फ़ाइल को पढ़ सकता है नहीं किया जा: Smarty error: unable to read resource: "header.tpl" इन त्रुटियों को दूर जाना के बाद तैनाती समाप्त हो गया है लगता है, तो हम यह मान ऐसा इसलिए है क्योंकि डेटा को सीधे वेब निर्देशिका में अनारक्षित करना चीजों का सबसे सुरक्षित नहीं है। मुझे लगता है कि हमें कुछ परमाणु की जरूरत है।

मेरे प्रश्न

हम कैसे atomically एक मौजूदा निर्देशिका (वेब ​​सर्वर के रूट निर्देशिका) में नई फ़ाइलों की प्रतिलिपि कर सकते हैं?

संपादित

फ़ाइलों है कि हम वेब निर्देशिका में समझौता कर रहे हैं केवल उन्हीं फ़ाइलों को निर्देशिका में नहीं हैं। हम निर्देशिका में फाइलें जोड़ रहे हैं, जिसमें पहले से ही फाइलें हैं। तो निर्देशिका की प्रतिलिपि बनाना या सिम्लिंक का उपयोग करना एक विकल्प नहीं है (जिसे मैं जानता हूं)।

+1

नाम बदलने परमाणु (mV) है, यह भी हो सकता है अपने सबसे अच्छे रूप सॉफ्ट लिंक का उपयोग करने के और वास्तविक वेब निर्देशिका /storage/www.revision.3282378 के लिए सिर्फ एक लिंक है उदाहरण के लिए – jackdoe

उत्तर

1

यहां मैं क्या करता हूं।

DocumentRoot उदाहरण के लिए, है, /var/www/sites/www.example.com/public_html/:

cd /var/www/sites/www.example.com/ 
svn export http://svn/path/to/tags/1.2.3 1.2.3 
ln -snf 1.2.3 public_html 

आप आसानी बजाय सिमलिंक बदलने से पहले अपने .tar.gz विस्तार करने के लिए इस संशोधित कर सकते svn से निर्यात करने के लिए। महत्वपूर्ण हिस्सा यह है कि परिवर्तन सिम्लिंक का परमाणु अनुप्रयोग है।

0

आपके पास साइट के 2 अलग-अलग संस्करणों के साथ 2 डीआईआर क्यों नहीं हैं। तो जब आपने साइट 2 में तैनाती समाप्त की, तो आपने बस अपने वेबसर्वर कॉन्फ़िगरेशन में साइट डीआईआर को स्विच किया (उदाहरण के लिए अपाचे) और सभी फ़ाइलों को साइट_1 dir पर कॉपी करें। फिर आप site_1 dir में तैनात कर सकते हैं और उसी विधि के साथ साइट_2 से स्विच कर सकते हैं।

+0

मुझे लगता है कि यहां उल्लिखित कुछ सबसे तेज़ तरीका है। अपनी नई सामग्री को एक अस्थायी फ़ोल्डर में कॉपी करें, फिर बाद में मूल और नया/अस्थायी फ़ोल्डर का नाम बदलें (जिसमें अधिक समय नहीं लगेगा)। – djot

+0

मेरा संपादन देखें - हमारे पास वेब रूट में अन्य फ़ाइलें हैं जो (मार्केटिंग साइट) और बहुत कुछ (> 40 जीबी उपयोगकर्ता उत्पन्न सामग्री) रहनी चाहिए, मैं हर समय डुप्लिकेट नहीं करना चाहता ... – mmattax

0

rsync को चलाने के लिए पैदा हुआ था ... एर ... मैं इस बहुत बात

rsync स्थानीय फ़ाइल सिस्टम और ssh पर काम करता है करने के लिए मतलब है - यह बहुत मजबूत है और तेजी - केवल भेजने/नकल बदली गई फाइलें

इसे हटाए गए किसी भी फाइल को हटाने के लिए कॉन्फ़िगर किया जा सकता है (या केवल स्रोत से गायब हो रहा है), या इसे अकेले छोड़ने के लिए कॉन्फ़िगर किया जा सकता है। सिंक्रनाइज़ करते समय आप कुछ फ़ाइलों/निर्देशिकाओं को बाहर करने के लिए सूचियों को बहिष्कृत कर सकते हैं।

यहां एक link to a tutorial है।

पुन: परमाणु - link to another question on SO

+0

इसके लायक होने के लिए , मैंने पिछले 2 वर्षों से किसी भी त्रुटि के बिना कोड को तैनात करने के लिए कई वेबसाइटों पर इसका उपयोग किया है (मैं लॉग और ईमेल त्रुटियां) - कोई अनुपलब्ध फ़ाइल नोटिस/त्रुटियां नहीं - बस आसान, एकल कमांड, कमांड लाइन स्क्रिप्टयुक्त तैनाती। –

+0

यह एक अच्छा विकल्प, स्थानीय निर्देशिका पर "एक बंद" के रूप में चलाने के किसी भी उदाहरण की तरह लगता है, या rsync हमेशा एक डिमन के रूप में चलाने चाहिए? – mmattax

+0

मैं एक स्क्रिप्ट के हिस्से के रूप में स्थानीय रूप से हर समय rsync चलाता हूं जो Google कोड प्रोजेक्ट को संकुल करता है। मुझे यकीन है कि मैंने कभी भी rsyncd कॉन्फ़िगर नहीं किया - मैं एक मैक पर हूं। –

0

मैं NFS विचार पसंद। हम अपने कोड को एनएफएस सर्वर पर तैनात करते हैं जो हमारे अग्रभागों पर आधारित है। वास्तव में जब हम एक नया संस्करण जारी करना चाहते हैं तो हम एक शेल स्क्रिप्ट चलाते हैं।क्या हम करते हैं अंतिम रिलीज dir करने के लिए एक सिमलिंक वर्तमान का उपयोग कर, इस तरह है:

/fasmounts/website/current -> /fasmounts/website/releases/2013120301/ 

और अपाचे दस्तावेज़ जड़ है:

/fasmounts/website/current/public 

(वास्तव में अपाचे दस्तावेज़ जड़/var/www है जो एक सिम्लिंक/fasmounts/वेबसाइट/वर्तमान/सार्वजनिक)

शेल स्क्रिप्ट नई रिलीज के लिए मौजूदा सिम्लिंक को अद्यतन करता है इसके बाद सब कुछ ठीक से अपलोड किया गया है।

1

मुझे लगता है कि rsyncscp के बजाय बेहतर विकल्प है, केवल बदली गई फ़ाइलों को सिंक्रनाइज़ किया जाएगा। लेकिन स्क्रिप्ट द्वारा कोड को तैनात करना किसी टीम में अवशोषण के लिए सुविधाजनक नहीं है, और तैनाती में त्रुटियां मानवकृत नहीं हैं।

आप कैपिस्ट्रानो, मैगलेन्स, नियोक्ता के बारे में सोच सकते हैं, लेकिन वे भी लिपि हैं। मैं अनुशंसा कर सकता हूं कि आपके पास walle-web है, जो PHP में लिखे गए एक परिनियोजन उपकरण को बॉक्स के बाहर yii2 के साथ है। मैंने इसे महीनों तक हमारी कंपनी में होस्ट किया है, यह परीक्षण, अनुकरण, उत्पादन वातावरण तैनात करते समय आसानी से काम करता है।

यह बैश उपकरण, rsync, Git, लिंक के समूहों पर निर्भर करते हैं, लेकिन एक वेब ui आम तौर पर अच्छी तरह से ऑपरेशन के लिए, एक कोशिश :)

+0

स्टैक ओवरफ़्लो में आपका स्वागत है! मैंने देखा है कि इस साइट पर अब तक आपके सभी पांच उत्तरों (जिनमें से दो को हाल ही में हटा दिया गया था) उसी टूल, वेले-वेब को बढ़ावा देता है। कृपया हमारे [दिशानिर्देशों पर स्व-पदोन्नति] (http://meta.stackexchange.com/a/59302/253560) पढ़ने के लिए कुछ समय दें। महत्वपूर्ण बात यह है कि यदि आप इस उपकरण से संबद्ध हैं, तो आपको प्रत्येक उत्तर में इसका खुलासा करने की आवश्यकता है। इसके अलावा आपको वास्तव में इस साइट पर अपने सभी उत्तरों में अपने टूल का प्रचार नहीं करना चाहिए। – josliber

संबंधित मुद्दे