{"title":"Como usar o Django com Apache e mod_wsgi","version":"6.1","locale":"pt-br","docname":"howto/deployment/wsgi/modwsgi","url":"/pt-br/6.1/howto/deployment/wsgi/modwsgi/","canonical":"https://djangodocs.dev/pt-br/6.1/howto/deployment/wsgi/modwsgi/","summary":"Implementar Django com Apache e mod_wsgi é uma forma testada e experimentada de colocar o Django em produção.","html":"<h1>Como usar o Django com Apache e <code class=\"docutils literal notranslate\">mod_wsgi</code><a class=\"heading-anchor\" href=\"#how-to-use-django-with-apache-and-mod-wsgi\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Implementar Django com <a class=\"reference external\" href=\"https://httpd.apache.org/\">Apache</a> e <a class=\"reference external\" href=\"https://modwsgi.readthedocs.io/en/develop/\">mod_wsgi</a> é uma forma testada e experimentada de colocar o Django em produção.</p>\n<p>O mod_wsgi é um módulo Apache o quam pode hospedar qualquer aplicação Python <a class=\"reference external\" href=\"https://wsgi.readthedocs.io/en/latest/\">WSGI</a>, incluindo Django. Django irá funcionar com qualquer versão do Apache que suporte mod_wsgi.</p>\n<p>A <a class=\"reference external\" href=\"https://modwsgi.readthedocs.io/\">official mod_wsgi documentation</a> é sua fonte para todos os detalhes sobre como usar mod_wsgi. Você provavelmente quer começar com <a class=\"reference external\" href=\"https://modwsgi.readthedocs.io/en/develop/installation.html\">installation and configuration documentation</a>.</p>\n<section id=\"basic-configuration\">\n<h2>Configuração Básica<a class=\"heading-anchor\" href=\"#basic-configuration\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Once you’ve got mod_wsgi installed and activated, edit your Apache server’s\n<a class=\"reference external\" href=\"https://cwiki.apache.org/confluence/display/httpd/DistrosDefaultLayout\">httpd.conf</a> file and add the following.</p>\n<div class=\"code-block\" data-language=\"apache\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Apache</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Apache code\"><code><span class=\"nb\">WSGIScriptAlias</span> / <span class=\"sx\">/path/to/mysite.com/mysite/wsgi.py</span>\n<span class=\"nb\">WSGIPythonHome</span> <span class=\"sx\">/path/to/venv</span>\n<span class=\"nb\">WSGIPythonPath</span> <span class=\"sx\">/path/to/mysite.com</span>\n\n<span class=\"nt\">&lt;Directory</span> <span class=\"s\">/path/to/mysite.com/mysite</span><span class=\"nt\">&gt;</span>\n<span class=\"nt\">&lt;Files</span> <span class=\"s\">wsgi.py</span><span class=\"nt\">&gt;</span>\n<span class=\"nb\">Require</span> <span class=\"k\">all</span> granted\n<span class=\"nt\">&lt;/Files&gt;</span>\n<span class=\"nt\">&lt;/Directory&gt;</span>\n</code></pre></div>\n<p>A primeira parte da linha <code class=\"docutils literal notranslate\">WSGIScriptAlias</code> é a URL base que você quer servir sua aplicação (<code class=\"docutils literal notranslate\">/</code> indica a URL raiz),  e a segunda é o local do arquivo “WSGI” – veja abaixo – no seu sistema, geralmente dentro do pacote do seu projeto (<code class=\"docutils literal notranslate\">mysite</code> neste exemplo). Isso diz ao Apache para servir qualquer requisição abaixo da URL informada usando a aplicação WSGI definida naquele arquivo.</p>\n<p>If you install your project’s Python dependencies inside a <a class=\"reference external\" href=\"https://docs.python.org/3/library/venv.html#module-venv\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">virtual\nenvironment</code></a>, add the path using <code class=\"docutils literal notranslate\">WSGIPythonHome</code>. See the <a class=\"reference external\" href=\"https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html\">mod_wsgi\nvirtual environment guide</a> for more details.</p>\n<p>A linha <code class=\"docutils literal notranslate\">WSGIPythonPath</code> assegura que o pacote do seu projeto está disponível no Python path para ser importado; em outras palavras, que <code class=\"docutils literal notranslate\">import mysite</code> funcione.</p>\n<p>The <code class=\"docutils literal notranslate\">&lt;Directory&gt;</code> piece ensures that Apache can access your <code class=\"file docutils literal notranslate\">wsgi.py</code>\nfile.</p>\n<p>Agora precisamos assegurar que este arquivo <code class=\"file docutils literal notranslate\">wsgi.py</code> com objeto de aplicação WSGI exista. Desde de o Django versão 1.4, <a class=\"reference internal\" href=\"/pt-br/6.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\">startproject</code></a> terá criado um para você; se não, você precisará criá-lo. Veja <a class=\"reference internal\" href=\"/pt-br/6.1/howto/deployment/wsgi/\"><span class=\"doc\">Documentação geral WSGI</span></a> para o conteúdo padrão que você deveria colocar neste arquivo, e o que mais você pode adicionar a ele.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Se múltiplos sites Django estiverem rodando em um único processo mod_wsgi, todos eles irão usar as definições daquele que executar primeiro. Isso pode ser resolvido alterando:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>os<span class=\"o\">.</span>environ<span class=\"o\">.</span>setdefault<span class=\"p\">(</span><span class=\"s2\">&quot;DJANGO_SETTINGS_MODULE&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;{{ project_name }}.settings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>em <code class=\"docutils literal notranslate\">wsgi.py</code>, para:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>os<span class=\"o\">.</span>environ<span class=\"p\">[</span><span class=\"s2\">&quot;DJANGO_SETTINGS_MODULE&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;{{ project_name }}.settings&quot;</span>\n</code></pre></div>\n<p>ou por <a class=\"reference internal\" href=\"#daemon-mode\"><span class=\"std std-ref\">usando o mode daemon do mod_wsgi</span></a> e assegurando que cada site está rodando no seu próprio processo deamon.</p>\n</aside>\n<aside class=\"admonition-fixing-unicodeencodeerror-for-file-uploads admonition\" role=\"note\">\n<p class=\"admonition-title\">Arrumando o <code class=\"docutils literal notranslate\">UnicodeEncodeError</code> para uploads de arquivos</p>\n<p>If you get a <code class=\"docutils literal notranslate\">UnicodeEncodeError</code> when uploading or writing files with\nfile names or content that contains non-ASCII characters, make sure Apache\nis configured to support UTF-8 encoding:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"nb\">export</span> <span class=\"nv\">LANG</span><span class=\"o\">=</span><span class=\"s1\">&#39;en_US.UTF-8&#39;</span>\n<span class=\"nb\">export</span> <span class=\"nv\">LC_ALL</span><span class=\"o\">=</span><span class=\"s1\">&#39;en_US.UTF-8&#39;</span>\n</code></pre></div>\n<p>Um lugar comum para colocar essa configuração é em <code class=\"docutils literal notranslate\">/etc/apache2/envvars</code>.</p>\n<p>Alternatively, if you are <a class=\"reference internal\" href=\"#daemon-mode\"><span class=\"std std-ref\">using mod_wsgi daemon mode</span></a>\nyou can add <code class=\"docutils literal notranslate\">lang</code> and <code class=\"docutils literal notranslate\">locale</code> options to the <code class=\"docutils literal notranslate\">WSGIDaemonProcess</code>\ndirective:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>WSGIDaemonProcess example.com lang=&#39;en_US.UTF-8&#39; locale=&#39;en_US.UTF-8&#39;\n</code></pre></div>\n<p>Veja a seção <a class=\"reference internal\" href=\"/pt-br/6.1/ref/unicode/#unicode-files\"><span class=\"std std-ref\">Files</span></a> do guia de referência de unicode para detalhes.</p>\n</aside>\n</section>\n<section id=\"using-mod-wsgi-daemon-mode\">\n<span id=\"daemon-mode\"></span><h2>Usando <code class=\"docutils literal notranslate\">mod_wsgi</code> no modo deamon<a class=\"heading-anchor\" href=\"#using-mod-wsgi-daemon-mode\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>“Modo Deamon” é o modo recomendado para rodar mod_wsgi (em plataforma não Windows). Para criar o grupo de processos deamon requerido e delegar o Django para rodar dentro, precisa adicionar as diretivas <code class=\"docutils literal notranslate\">WSGIDaemonProcess</code> e <code class=\"docutils literal notranslate\">WSGIProcessGroup</code>. Um outra mudança requerida na configuração acima se usar deamon mode é que não se pode usar o <code class=\"docutils literal notranslate\">WSGIPythonPath</code>; no lugar deve usar a opção <code class=\"docutils literal notranslate\">python-path</code> para <code class=\"docutils literal notranslate\">WSGIDaemonProcess</code>, por exemplo:</p>\n<div class=\"code-block\" data-language=\"apache\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Apache</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Apache code\"><code><span class=\"nb\">WSGIDaemonProcess</span> example.com python-home=/path/to/venv python-path=/path/to/mysite.com\n<span class=\"nb\">WSGIProcessGroup</span> example.com\n</code></pre></div>\n<p>Se quer servir seu projeto em um subdiretório (<code class=\"docutils literal notranslate\">https://example.com/mysite</code> neste exemplo), você pode adicionar <code class=\"docutils literal notranslate\">WSGIScriptAlias</code> a configuração acima:</p>\n<div class=\"code-block\" data-language=\"apache\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Apache</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Apache code\"><code><span class=\"nb\">WSGIScriptAlias</span> <span class=\"sx\">/mysite</span> <span class=\"sx\">/path/to/mysite.com/mysite/wsgi.py</span> process-group=example.com\n</code></pre></div>\n<p>Veja a documentação oficial do mod_wsgi para  <a class=\"reference external\" href=\"https://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html#delegation-to-daemon-process\">details on setting up daemon mode</a></p>\n</section>\n<section id=\"serving-files\">\n<span id=\"id1\"></span><h2>Servindo arquivos<a class=\"heading-anchor\" href=\"#serving-files\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django doesn’t serve files itself; it leaves that job to whichever web\nserver you choose.</p>\n<p>We recommend using a separate web server – i.e., one that’s not also running\nDjango – for serving media. Here are some good choices:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://nginx.org/en/\">Nginx</a></p></li>\n<li><p>Uma versão mais enxuta do <a class=\"reference external\" href=\"https://httpd.apache.org/\">Apache</a></p></li>\n</ul>\n<p>Se, porém, você não tem opção de servir arquivos de media na mesmo VirtualHost Apache que está o Django, você pode configurar o Apache para servir algumas URLs como media estática, e outros usando a interface mod_wsgi para  Django.</p>\n<p>Este exemplo define o DJango como raiz do site, mas serve <code class=\"docutils literal notranslate\">robots.txt</code>, <code class=\"docutils literal notranslate\">favicon.ico</code>, e qualquer coisa nas URLs <code class=\"docutils literal notranslate\">/static/</code>  e <code class=\"docutils literal notranslate\">/media</code> como arquivos estáticos. Todas as outra URLs serão servidas usando o mod_wsgi:</p>\n<div class=\"code-block\" data-language=\"apache\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Apache</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Apache code\"><code><span class=\"nb\">Alias</span> <span class=\"sx\">/robots.txt</span> <span class=\"sx\">/path/to/mysite.com/static/robots.txt</span>\n<span class=\"nb\">Alias</span> <span class=\"sx\">/favicon.ico</span> <span class=\"sx\">/path/to/mysite.com/static/favicon.ico</span>\n\n<span class=\"nb\">Alias</span> <span class=\"sx\">/media/</span> <span class=\"sx\">/path/to/mysite.com/media/</span>\n<span class=\"nb\">Alias</span> <span class=\"sx\">/static/</span> <span class=\"sx\">/path/to/mysite.com/static/</span>\n\n<span class=\"nt\">&lt;Directory</span> <span class=\"s\">/path/to/mysite.com/static</span><span class=\"nt\">&gt;</span>\n<span class=\"nb\">Require</span> <span class=\"k\">all</span> granted\n<span class=\"nt\">&lt;/Directory&gt;</span>\n\n<span class=\"nt\">&lt;Directory</span> <span class=\"s\">/path/to/mysite.com/media</span><span class=\"nt\">&gt;</span>\n<span class=\"nb\">Require</span> <span class=\"k\">all</span> granted\n<span class=\"nt\">&lt;/Directory&gt;</span>\n\n<span class=\"nb\">WSGIScriptAlias</span> / <span class=\"sx\">/path/to/mysite.com/mysite/wsgi.py</span>\n\n<span class=\"nt\">&lt;Directory</span> <span class=\"s\">/path/to/mysite.com/mysite</span><span class=\"nt\">&gt;</span>\n<span class=\"nt\">&lt;Files</span> <span class=\"s\">wsgi.py</span><span class=\"nt\">&gt;</span>\n<span class=\"nb\">Require</span> <span class=\"k\">all</span> granted\n<span class=\"nt\">&lt;/Files&gt;</span>\n<span class=\"nt\">&lt;/Directory&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"serving-the-admin-files\">\n<span id=\"id3\"></span><h2>Persistindo arquivos do admin<a class=\"heading-anchor\" href=\"#serving-the-admin-files\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>When <a class=\"reference internal\" href=\"/pt-br/6.1/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.staticfiles</code></a> is in <a class=\"reference internal\" href=\"/pt-br/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>, the\nDjango development server automatically serves the static files of the\nadmin app (and any other installed apps). This is however not the case when you\nuse any other server arrangement. You’re responsible for setting up Apache, or\nwhichever web server you’re using, to serve the admin files.</p>\n<p>The admin files live in (<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/static/admin\">django/contrib/admin/static/admin</a>) of the\nDjango distribution.</p>\n<p>We <strong>strongly</strong> recommend using <a class=\"reference internal\" href=\"/pt-br/6.1/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.staticfiles</code></a> to handle the\nadmin files (along with a web server as outlined in the previous section; this\nmeans using the <a class=\"reference internal\" href=\"/pt-br/6.1/ref/contrib/staticfiles/#django-admin-collectstatic\"><code class=\"xref std std-djadmin docutils literal notranslate\">collectstatic</code></a> management command to collect the\nstatic files in <a class=\"reference internal\" href=\"/pt-br/6.1/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_ROOT</code></a>, and then configuring your web server to\nserve <a class=\"reference internal\" href=\"/pt-br/6.1/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_ROOT</code></a> at <a class=\"reference internal\" href=\"/pt-br/6.1/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_URL</code></a>), but here are three\nother approaches:</p>\n<ol class=\"arabic simple\">\n<li><p>Crie um link simbólico para os arquivos estáticos do admin de dentro do seu “document root”(isso talvez requeira <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>+FollowSymLinks``na sua configuração do Apache).</p></li>\n<li><p>Use uma diretiva <code class=\"docutils literal notranslate\">Alias</code>, como demonstrado acima, para apelidar a URL apropriada (provavelmente : settings:SATTIC_URL`+ ``admin/`) para o local real dos arquivos do admin.</p></li>\n<li><p>Copie os arquivos estáticos do admin para que entã eles fiquem dentro do “document root” do Apache.</p></li>\n</ol>\n</section>\n<section id=\"authenticating-against-django-s-user-database-from-apache\">\n<h2>Autenticação do banco de dados de usuário do Django vindo do Apache.<a class=\"heading-anchor\" href=\"#authenticating-against-django-s-user-database-from-apache\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O Django disponibiliza um facilitador para habilitar o Apache a autenticar usuários diretamente no backend de autenticação do Django. veja   <a class=\"reference internal\" href=\"/pt-br/6.1/howto/deployment/wsgi/apache-auth/\"><span class=\"doc\">documentação de autenticação do mod_wsgi</span></a>.</p>\n</section>","rootId":"how-to-use-django-with-apache-and-mod-wsgi","toc":[{"title":"Configuração Básica","anchor":"basic-configuration","children":[]},{"title":"Usando mod_wsgi no modo deamon","anchor":"using-mod-wsgi-daemon-mode","children":[]},{"title":"Servindo arquivos","anchor":"serving-files","children":[]},{"title":"Persistindo arquivos do admin","anchor":"serving-the-admin-files","children":[]},{"title":"Autenticação do banco de dados de usuário do Django vindo do Apache.","anchor":"authenticating-against-django-s-user-database-from-apache","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/pt-br/6.1/howto/"},{"docname":"howto/deployment/index","title":"How to deploy Django","url":"/pt-br/6.1/howto/deployment/"},{"docname":"howto/deployment/wsgi/index","title":"Como implementar com WSGI","url":"/pt-br/6.1/howto/deployment/wsgi/"}],"prev":{"docname":"howto/deployment/wsgi/uwsgi","title":"Como usar Django com uWSGI","url":"/pt-br/6.1/howto/deployment/wsgi/uwsgi/"},"next":{"docname":"howto/deployment/wsgi/apache-auth","title":"How to authenticate against Django’s user database from Apache","url":"/pt-br/6.1/howto/deployment/wsgi/apache-auth/"},"formats":{"html":"/pt-br/6.1/howto/deployment/wsgi/modwsgi/","markdown":"/pt-br/6.1/howto/deployment/wsgi/modwsgi.md","json":"/pt-br/6.1/howto/deployment/wsgi/modwsgi.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/deployment/wsgi/modwsgi.txt","official":"https://docs.djangoproject.com/pt-br/6.1/howto/deployment/wsgi/modwsgi/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}