สวัสดีทุกคน นี่เป็นบทความแรกของฉันใน <» FromLinux (จากหลายๆ บทความที่ฉันมีในฉบับร่าง xD) ฉันหวังว่ามันจะมีประโยชน์สำหรับคุณ
ในงานใหม่และงานปัจจุบันของฉันในขณะนี้กำลังมีการย้ายระบบหลายระบบไปยัง Django (แปลกขนาดไหนเนี่ย ?? xD) และหนึ่งในงานของฉันนอกเหนือจากการพัฒนากำลังนำสิ่งเหล่านี้ไปสู่การผลิตดังนั้นจะดีแค่ไหน เด็กฝึกงานเนื่องจากเป็นครั้งแรกที่ฉันนำแอปพลิเคชันไปใช้ในการผลิตบนเซิร์ฟเวอร์จริง: $ ฉันเริ่มอ่านเอกสารอย่างเป็นทางการของแต่ละแพ็คเกจที่ต้องการของสแต็ก (Gunicorn และ Supervisord ส่วนใหญ่) และเห็นว่าบทช่วยสอนใน ภาษาสเปนพวกเขาไม่ค่อยชัดเจนสำหรับฉันในบางแง่มุมฉันตัดสินใจสร้างมินิไกด์พร้อมขั้นตอนที่ฉันทำตามเพื่อนำแอปพลิเคชันไปใช้ในการผลิตโดยอิงจากสแต็ก Django, Gunicorn, Supervisord, Nginx และ Postgresql
ในกรณีที่ฉันทำงานเซิร์ฟเวอร์ยังคงใช้งาน Debian Squeeze อยู่ แต่คำแนะนำควรจะใช้ได้อย่างสมบูรณ์สำหรับการแจกแจงอื่น ๆ ... ดังนั้นมาตรงประเด็นและเริ่มต้น:
ฉันจะทำงานเป็นผู้ใช้ขั้นสูง ก่อนอื่นต้องใช้แพ็คเกจต่อไปนี้:
PIP -> เครื่องมือในการติดตั้งและจัดการแพ็คเกจสำหรับ Python
aptitude install python-pip
Nginx -> เว็บเซิร์ฟเวอร์ (เราจะใช้เป็น reverse proxy และเพื่อแคชไฟล์คงที่ 'img, js, css') เราติดตั้งด้วย:
aptitude install nginx
Supervisord -> แอปพลิเคชันสำหรับจัดการและตรวจสอบแอปพลิเคชันของเราแม้ว่าจะใช้งานได้อีกมากมาย เราติดตั้งด้วย:
aptitude install supervisor
virtualenv -> ช่วยให้เราสร้างสภาพแวดล้อมการดำเนินการเสมือนที่กำหนดเองสำหรับแอปพลิเคชันของเรา เราติดตั้งด้วย:
aptitude install python-virtualenv
กันนิคอร์น -> เว็บเซิร์ฟเวอร์สำหรับ python (เรายังไม่ได้ติดตั้งสิ่งนี้)
ฉันคิดว่าพวกเขาควรติดตั้งและกำหนดค่า postgresql ไว้แล้ว
โรคจิต 2 -> ตัวเชื่อมต่อ Postgresql สำหรับ python (เรายังไม่ได้ติดตั้ง)
สร้างสภาพแวดล้อมเสมือนจริงด้วย Virtualenv:
ก่อนอื่นเราจะย้ายไปที่ไดเร็กทอรีการทำงานที่เราจะใช้ในการผลิต:
cd /var/www/
จากนั้นในไดเรกทอรีนี้เราจะสร้างสภาพแวดล้อมเสมือน:
virtualenv ENV-nombreApp
เราย้ายไปที่ไดเร็กทอรีที่ฉันเพิ่งสร้าง Virtualenv
cd ENV-nombreAPP
เราคัดลอกแอปพลิเคชันในไดเรกทอรีนี้และตอนนี้เราดำเนินการเพื่อเปิดใช้งานสภาพแวดล้อมด้วย:
source bin/activate
ตอนนี้พรอมต์ควรมีลักษณะดังนี้ (ENV)usuario@host:
ตอนนี้จะทำให้ทุกสิ่งที่เราทำถูกเก็บไว้ในไดเร็กทอรี / var / www / ENV-appname / โดยไม่ส่งผลกระทบต่อแพ็คเกจระบบ
ตอนนี้เราย้ายไปที่ไดเรกทอรีแอปพลิเคชัน:
cd nombreApp
เราดำเนินการติดตั้งรายการการขึ้นต่อกันของแอปพลิเคชัน (หากจำเป็น) ซึ่งระบุไว้ในไฟล์ Requirement.txt:
pip install -r requirements.txt
นอกจากนี้เรายังสามารถติดตั้งแพ็กเกจแยกกันตัวอย่างเช่นเพื่อติดตั้งตัวเชื่อมต่อของ PostgreSQL:
pip install psycopg2
การติดตั้งและการกำหนดค่า GUnicorn:
ในการติดตั้งเราทำในลักษณะเดียวกัน:
pip install gunicorn
ตอนนี้เรากำลังจะกำหนดค่าสำหรับสิ่งนี้เราจะสร้างไฟล์ชื่อ gunicorn-deploy.py ในรูทของแอปพลิเคชันของเรา (แม้ว่าชื่อจะเป็นอะไรก็ได้) โดยมีเนื้อหาต่อไปนี้:
bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging
การกำหนดค่าหัวหน้างาน:
ตอนนี้มาตั้งค่า supervisordด้วยเหตุนี้เราจึงสร้างไฟล์การกำหนดค่าด้วย
echo_supervisord_conf > /etc/supervisord.conf
ตอนนี้เราแก้ไขไฟล์กำหนดค่า:
vim /etc/supervisord.conf
และเรายกเลิกการใส่ข้อคิดเห็นในบรรทัดต่อไปนี้โดยการลบ; (อัฒภาค):
[unix_http_server] ไฟล์ = / tmp / Supervisor.sock [ผู้ควบคุม] logfile = / var / log / Supervisor.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel = debug pidfile = / var / run / Supervisor.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: Supervisor] Supervisor.rpcinterface_factory = Supervisor.rpcinterface: make_main_rpcinterface [Supervisorctl] serverurl = unix: [program: appname] command = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -Appname / appname / gunicorn-deploy.py ไดเร็กทอรี = / var / www / ENV-appname / appname / autostart = true autorestart = true user = Username redirect_stderr = true stdout_logfile = / var / www / logs / appname / Supervisorord.log
ตอนนี้เราจะสร้างสคริปต์สำหรับผู้บังคับบัญชาเพื่อเริ่มต้นด้วยระบบเพื่อที่เราจะสร้างไฟล์:
vim /etc/init.d/supervisord
และเราเพิ่มเนื้อหาต่อไปนี้:
# ผู้บังคับบัญชาเริ่มต้นอัตโนมัติ # # คำอธิบาย: เริ่มต้นอัตโนมัติผู้บังคับบัญชา # ชื่อกระบวนการ: ผู้บังคับบัญชา # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / ผู้บังคับบัญชา SUPERVISORCTL = / usr / local / bin / ผู้บังคับบัญชากรณีที่ $ 1 ในการเริ่มต้น) echo -n "การเริ่มต้นหัวหน้างาน:" $ SUPERVISORD echo ;; หยุด) echo -n "การหยุดผู้บังคับบัญชา:" เสียงสะท้อนการปิดระบบ $ SUPERVISORCTL ;; เริ่มต้นใหม่) echo -n "การหยุดหัวหน้างาน:" เสียงก้องปิดเสียง $ SUPERVISORCTL -n "การเริ่มต้นหัวหน้างาน:" เสียงสะท้อน $ SUPERVISORD ;; ว่า C
และตอนนี้เราให้สิทธิ์ดำเนินการกับไฟล์เพื่อให้สามารถเริ่มต้นด้วยระบบ:
sudo chmod +x /etc/init.d/supervisord
เราอัปเดตลิงก์เพื่อเริ่มบริการ:
sudo update-rc.d supervisord defaults
เราเริ่มให้บริการ:
sudo /etc/init.d/supervisord start
การตั้งค่า nginx:
ขั้นตอนนี้ค่อนข้างง่ายเราจะสร้างไฟล์กำหนดค่าต่อไปนี้ของ Nginx สำหรับแอปพลิเคชันของเรา:
vim /etc/nginx/sites-enabled/nombreApp
และเราจะเพิ่มเนื้อหาต่อไปนี้ให้กับคุณ
เซิร์ฟเวอร์ {ฟัง 9001; # พอร์ตที่พวกเขาต้องการให้ nginx ฟัง server_name www.domain.com; # หรือ 192.168.0.100 ที่อยู่ที่เราจะเข้าถึง access_log /var/log/nginx/Appname.access.log; # ที่เราจะมีตำแหน่งบันทึกแอปพลิเคชัน / {# โดยที่ nginx จะเรียกเมื่อเข้าถึง www.dominio.com/proxy_pass http://127.0.0.1:8001; proxy_set_header โฮสต์ $ http_host; } location / static / {# โดยที่ nginx จะเข้าถึงเมื่อเราป้อน www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}
และเรารีสตาร์ท nginx:
service nginx restart
การตั้งค่า Django:
มาแก้ไขไฟล์คอนฟิกูเรชัน django:
vim nombreApp/settings.py
เรามองหาบรรทัดที่ระบุว่า DEBUG = จริง และเราเปลี่ยนค่าที่เหลืออยู่ DEBUG = เท็จ
เราเพิ่มพารามิเตอร์ DB:
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # หรือ mysql หรืออะไรก็ตามที่ใช้ 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'password DB', 'HOST': 'localhost', # หรือรหัสที่ต้องการ 'PORT': '', # หรือรหัสที่ใช้อยู่}}
เรามองหาเส้น ALLOWED_HOSTS = [] และเราเพิ่มโดเมนหรือที่อยู่ที่เราจะเข้าถึงโดยปล่อยให้สิ่งต่างๆเช่น ALLOWED_HOSTS = ['www.domain.com']
เรากำหนดค่าไดเร็กทอรีสำหรับไฟล์คงที่เรามองหาบรรทัดที่ระบุว่า STATIC_ROOT = ' ' และเราเปลี่ยนค่าวางเส้นทางสัมบูรณ์ที่เราต้องการให้ไฟล์คงที่ในกรณีของฉันฉันปล่อยมันไว้อย่างนี้มากหรือน้อย STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'
เกือบเสร็จแล้วเราดำเนินการคำสั่งต่อไปนี้:
./manage.py collectstatic
สิ่งนี้จะสร้างโฟลเดอร์ที่มีชื่อ 'วิชาว่าด้วยวัตถุ ในเส้นทางที่เราระบุในไฟล์ settings.py 'นั่นคือที่มาของไฟล์คงที่ทั้งหมดของเรา
และในที่สุดเราก็รีสตาร์ทหัวหน้างานเพื่อทำการเปลี่ยนแปลงใหม่:
supervisorctl restart nombreApp
และนั่นก็คงเป็นเช่นนั้น สุดท้ายแล้วมันก็ไม่ใช่เรื่องใหญ่อะไรใช่ไหม? มันดูเหมือนง่ายสำหรับฉัน
ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ สวัสดี