рдбреЗрдмрд┐рди рд╕реНрдХреНрд╡реАрдЬрд╝ рдкрд░ рдирдЧреНрдиреЗрдХреНрд╕ + uWSGI + рд╡рд░реНрдЪреБрдЕрдирд╡ + Django

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдореБрдЭреЗ Django рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдврдХрд░ рд╣реИрд░рд╛рди рдерд╛, рдЬрд┐рд╕рдХреА рджреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдереАрдВ:
  1. рдПрдХ рдореЗрдЬрдмрд╛рди рдкрд░ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░рдВрдн / рд░реЛрдХ / рдкреБрдирдГ рдЖрд░рдВрдн
  2. рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдкрд░, рдореЗрд░реА рдкрд╕рдВрдж Nginx + uWSGI рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдереАред рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВрдиреЗ рдЬрд┐рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдореБрдЭреЗ рдбреЗрдмрд┐рдпрди рдореЗрдВ uWSGI рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рдЖрдИред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрдирд╛


UWSGI рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди Nginx рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг 0.8.40 рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рдбреЗрдмрд┐рдпрди рд╢рд╛рдЦрд╛ рдореЗрдВ рди рддреЛ рдкрд╣рд▓рд╛ рдФрд░ рди рд╣реА рджреВрд╕рд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо Nginx рдХреЛ рдмреИрдХрд╕реНрдЯ рд╕реЗ, рдФрд░ uWSGI рд╕реЗ рдПрдХ рдЕрд╕реНрдерд┐рд░ рд╢рд╛рдЦрд╛ рд╕реЗ рд▓реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ /etc/apt/source.list рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free deb http://ftp.ru.debian.org/debian testing main non-free contrib deb http://ftp.ru.debian.org/debian unstable main non-free contrib 

рдФрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдПрдБ / рдЖрджрд┐ / рдЙрдкрдпреБрдХреНрдд / рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ:
 Package: * Pin: release a=stable Pin-Priority: 700 Package: * Pin: release a=squeeze-backports Pin-Priority: 675 Package: * Pin: release a=testing Pin-Priority: 650 Package: * Pin: release a=unstable Pin-Priority: 600 

рд╣рдо рдПрдкреНрдЯреАрдЯреНрдпреВрдб рдЕрдкрдбреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 aptitude -t squeeze-backports install nginx aptitude -t unstable install uwsgi aptitude -t unstable install uwsgi-plugin-python aptitude -t unstable install python-virtualenv 

рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛


рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рддреИрдирд╛рддреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╡реЗрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдкреНрд░реЙрдЬреЗрдХреНрдЯ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░реЛрдЬ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрдерд┐рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЗрдВ рд░рдЦреА рдЬрд╛рдПрдВрдЧреА, рдЬрд┐рд╕рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП Nginx рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рд░реНрдЧ рдорд┐рд▓рддреЗ рд╣реИрдВ:
 /home/web/proj/example /home/web/proj/static/example 

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ:
 STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '../static/example')) STATIC_URL = '/static/' 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╛рдореВрд╣рд┐рдХ рдкреНрд░рдмрдВрдзрди рдЯреАрдо рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХреЛ / рд╣реЛрдо / рд╡реЗрдм / рдкреНрд░реЛрдЬ / рд╕реНрдЯреЗрдЯрд┐рдХ / рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧреАред

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг / рдШрд░ / рд╡реЗрдм / envs / рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред

UWSGI рдФрд░ Nginx рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП uWSGI рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ /etc/uwsgi/apps-available/example.ini рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рд▓реЗрдЧрд╛:
 [uwsgi] plugins = python27 virtualenv = /home/web/envs/example/ chdir = /home/web/proj/example/ pythonpath = .. env = DJANGO_SETTINGS_MODULE=example.settings module = django.core.handlers.wsgi:WSGIHandler() touch-reload = /home/web/proj/example/touchme 

рд╣рдо рдЗрд╕реЗ / etc / uwsgi / apps- рд╕рдХреНрд╖рдо рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ:
 cd /etc/uwsgi/apps-enabled ln -s ../apps-available/example.ini . 

рдлрд┐рд░ рд╣рдо uWSGI рдбреЗрдореЙрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: /etc/init.d/uwsgi рдкреНрд░рд╛рд░рдВрдн рдЙрджрд╛рд╣рд░рдг

Nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ / etc / nginx / рд╕рд╛рдЗрдЯреНрд╕-рдЙрдкрд▓рдмреНрдз / рдЙрджрд╛рд╣рд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕рдХрд╛ рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд▓реНрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 server { listen 80; server_name example; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; location /static/ { alias /home/web/proj/static/example/; } location / { include uwsgi_params; uwsgi_pass unix:///var/run/uwsgi/app/example/socket; } } 

рдЙрд╕реА рддрд░рд╣, / etc / nginx / рд╕рд╛рдЗрдЯреНрд╕-рд╕рдХреНрд╖рдо рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВ:
 cd /etc/nginx/sites-enabled/ ln -s ../sites-available/example . 

рдФрд░ Nginx рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ: /etc/init.d/nginx рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ

рд╣реБрдб рдХреЗ рдиреАрдЪреЗ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ uWSGI рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред Chdir рдФрд░ pythonpath рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рдЙрд╕рдХреЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдкрд╛рдпрдерди рдЦреЛрдЬ рдкрде рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред Env рдФрд░ рдореЙрдбреНрдпреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ uWSGI рдбреЗрдореЙрди рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдП рдмрд┐рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЯрдЪ-рд░реАрд▓реЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдкрдХреЛ рдЯрдЪ / рд╣реЛрдо / рд╡реЗрдм / рдкреНрд░реЛрдЬ / рдЙрджрд╛рд╣рд░рдг / рдЯрдЪрдореЗ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

UWSGI рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдирд┐рдХрд▓реА рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ /etc/init.d/uwsgi рдПрдХ рдЕрдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ /usr/share/uwsgi/conf/default.ini рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ /etc/uwsgi/apps-available/example.ini рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, /usr/share/uwsgi/conf/default.ini рдХреА рд╕рд╛рдордЧреНрд░реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:
 [uwsgi] # try to autoload appropriate plugin if "unknown" option has been specified autoload = true # enable master process manager master = true # spawn 2 uWSGI worker processes workers = 2 # automatically kill workers on master's death no-orphans = true # write master's pid in file /run/uwsgi/<confnamespace>/<confname>/pid pidfile = /run/uwsgi/%(deb-confnamespace)/%n/pid # bind to UNIX socket at /run/uwsgi/<confnamespace>/<confname>/socket socket = /run/uwsgi/%(deb-confnamespace)/%n/socket # set mode of created UNIX socket chmod-socket = 660 # place timestamps into log log-date = true # user identifier of uWSGI processes uid = www-data # group identifier of uWSGI processes gid = www-data 

рдбреЗрдмрд┐рдпрди uWSGI рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╛рдорд╕реНрдерд╛рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред Default.ini рдореЗрдВ , рдЗрд╕реЗ рдбрд┐рдлреЙрд▓реНрдЯ рд╡реИрд▓реНрдпреВ рдРрдк рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдмрд▓ % (deb-confnamespace) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдирд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкреНрд░рд╛рд░рдВрдн рд╕реНрдХреНрд░рд┐рдкреНрдЯ /etc/init.d/uwsgi рдПрд╕-рд╕рдХреНрд╖рдо рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП / etc / uwsgi рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрдк-рдирд╛рдо рдирд╛рдо sceding s- рд╕рдХреНрд╖рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдерд╛рди рдХрд╛ рдирд╛рдо рдмрди рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ / etc / uwsgi рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рд╛рдЗрдЯ-рдЙрдкрд▓рдмреНрдз рдФрд░ рд╕рд╛рдЗрдЯ-рд╕рдХреНрд╖рдо рд╣реЛрдВ , рдЬрд┐рд╕рдореЗрдВ рдХреНрд░рдорд╢рдГ example.ini рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ; рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП pidfile рдФрд░ рд╕реЙрдХреЗрдЯ / рд░рди / uwsgi / рд╕рд╛рдЗрдЯ / рдЙрджрд╛рд╣рд░рдг / pid рдФрд░ / run / uwsgi / рд╕рд╛рдЗрдЯ / рдЙрджрд╛рд╣рд░рдг / рд╕реЙрдХреЗрдЯ рдореЗрдВ рд╣реЛрдЧрд╛ , рдФрд░ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП uWSGI рдбреЗрдорди /etc/init.d/ рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ uwsgi start | stop | рдкреБрдирдГ рдЖрд░рдВрдн рд╕рд╛рдЗрдЯ / рдЙрджрд╛рд╣рд░рдг ред рдпрджрд┐ рдХреЛрдИ рдЙрдкрд╕рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рддреЛ рдРрдк рдиреЗрдорд╕реНрдкреЗрд╕ рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In136295/


All Articles