前文連接配接:
Nginx與django+uwsgi成功勾搭的始末(上)
<a href="http://chenx1242.blog.51cto.com/10430133/1907430" target="_blank">http://chenx1242.blog.51cto.com/10430133/1907430</a>
正文内容:
在“Nginx與django+uwsgi成功勾搭的始末(上)”裡我們已經實作了可以用浏覽器通路我們django裡的靜态檔案,注意,是django裡的檔案,而不是nginx裡的。也就是說我們打開nginx是可以通路django裡的靜态檔案,而不能通路django裡的其他内容,隻有我們啟動了nginx同時也啟動了django,才會通路django裡的動态檔案。
這篇文章的内容是驗證socket是否可以連接配接起nginx和uwsgi。
在/home/下面我記得我們是有一個叫logan.py,裡面的内容是這樣的:
1
2
3
<code>def</code> <code>application(env, start_response):</code>
<code> </code><code>start_response(</code><code>'200 OK'</code><code>, [(</code><code>'Content-Type'</code><code>,</code><code>'text/html'</code><code>)])</code>
<code> </code><code>return</code> <code>[</code><code>"Good bye,Logan..."</code><code>] </code><code># python2</code>
現在我們來到home檔案夾,ps -ef一下确認背景程序nginx是沒有的,uwsgi也是沒有的,使用#uwsgi --plugin python --socket :8001 --wsgi-file logan.py。然後在浏覽器裡測試“外網位址:8001”,發現網頁無法打開,同時伺服器終端提示:“invalid request block size: 21573 (max 4096)...skip”。
這是因為在#uwsgi --plugin python --socket :8001 --wsgi-file logan.py這個指令裡,我們用 socket的方式去打開logan.py,這個方式預設是tcp的,而我們在浏覽器通路卻是走的http協定,自然會失敗了。而我們在前面已經知道用#uwsgi --plugin python --http-socket :8001 --wsgi-file logan.py是可以打開的,但是我們的目的是要驗證“socket是否可以連接配接起nginx和uwsgi”。怎麼辦?
此時,我們還是需要啟動nginx,但是要用我們之前的mysite_nginx.conf,于是我們#nginx -c /etc/nginx/sites-enabled/mysite_nginx.conf。
然後我們再試試#uwsgi --plugin python --socket :8001 --wsgi-file logan.py,在浏覽器裡輸入“外網位址:8000”,發現浏覽器裡出現了"Good bye,Logan...",不僅這個界面OK,就連我們之前的那個電影海報(media/logan.jpg)也是OK的。
至此我們可以大吼一聲:
<code>Web Client <===> Web Server(nginx) <===> The Socket <===> uWSGI <===> Python</code>
這條通道已經徹底打通了!
打通了還沒完,我們需要進去搞事情。現在我們修改一下mysite_nginx.conf,把裡面的server改成這樣:
<code>server unix:</code><code>///django/logan/logan</code><code>.sock;</code>
然後#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py,這樣規定它使用socket去代替那些協定去啟動那個py檔案。估計看到這裡很多人會有疑問,為啥憑空出現了一個logan.sock?這是什麼鬼?
因為這個logan.sock是在uwsgi啟動之後自動生成的,當我們執行了#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py之後,來到/django/logan裡就會發現裡面多了一個粉嫩的logan.sock,預設權限是755:
<a href="https://s5.51cto.com/wyfs02/M01/8E/D4/wKiom1jLpH2zOzUNAACez2oOghY649.png" target="_blank"></a>
現在我們去浏覽器裡試試“外網位址:8000”,發現卻是502,bad gateway:
<a href="https://s2.51cto.com/wyfs02/M01/8E/D4/wKiom1jLpVmTztOaAAChqxGiQuI807.png" target="_blank"></a>
不要虛,去檢視一下nginx的error.log,裡面的回報是這樣的:
<code>2017</code><code>/03/17</code> <code>16:57:06 [crit] 29123</code><code>#0: *9 connect() to unix:///django/logan/logan.sock failed (13: Permission denied) while connecting to upstream, client: 60.191.94.120, server: 121.40.52.61, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///django/logan/logan.sock:", host: "121.40.52.61:8000"</code>
既然說權限不足,nginx無法調用這個socket檔案,那就#chmod 666 logan.sock權重限好了。
然後我們再試試#uwsgi --plugin python --socket /django/logan/logan.sock --wsgi-file logan.py --chmod-socket=666,在浏覽器上重新整理一下“外網位址:8000”,就看到了logan.py裡的“Good bye,Logan...”了,現在我們應該也可以用這個方法啟動一下我們的django project,指令就是#uwsgi --plugin python --socket /django/logan/logan.sock --chdir /django/logan/ --wsgi-file /django/logan/logan/wsgi.py --chmod-socket=666。
現在我們在浏覽器裡打開“外網位址:8000/admin”,就會看到django的頁面:
<a href="https://s2.51cto.com/wyfs02/M00/8E/D3/wKioL1jLrmWA8yxFAAB1Ks5TXJo004.png" target="_blank"></a>
當然了,打開media/logan.jpg一樣會看到那張《金剛狼3》的電影海報。
不過uwsgi啟動指令太長了,uwsgi可以使用ini或者xml兩個檔案方式來簡化啟動指令,我們在/django/logan裡建立一個uwsgi_logan.ini,裡面的内容是這樣的:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code># mysite_uwsgi.ini file</code>
<code>[uwsgi]</code>
<code># Django-related settings</code>
<code>plugin = python</code>
<code># the base directory (full path)</code>
<code>chdir = </code><code>/django/logan/</code>
<code># Django's wsgi file</code>
<code>wsgi-</code><code>file</code> <code>= </code><code>/django/logan/logan/wsgi</code><code>.py</code>
<code># the virtualenv (我的python隻有一個版本是以沒有用這個,有的話這裡需要填寫全路徑)</code>
<code># home = /path/to/virtualenv</code>
<code># process-related settings</code>
<code># master</code>
<code>master = </code><code>true</code>
<code># maximum number of worker processes(這裡的數字請根據自己實際情況填寫,4個已經夠用了)</code>
<code>processes = 4</code>
<code># the socket (填寫全路徑)</code>
<code>socket = </code><code>/django/logan/logan</code><code>.sock</code>
<code># ... with appropriate permissions - may be needed</code>
<code>chmod</code><code>-socket = 666</code>
<code># clear environment on exit(退出的時候會清理)</code>
<code>vacuum = </code><code>true</code>
<code>pidfile = </code><code>/django/logan/uwsgi_logan</code><code>.pid </code><code>#确定pid的檔案</code>
<code>daemonize = </code><code>/django/logan/uwsgi_logan</code><code>.log </code><code>#确定日志檔案</code>
然後使用#uwsgi --ini /django/logan/uwsgi_logan.ini,來啟動django吧。
參考資料:http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
參考資料:http://stackoverflow.com/questions/23148082/in-django-nginx-wsgi-what-is-a-mysite-sock
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1907674