最近用了nodejs搭建服務器,然後用了nginx做了反向代理,項目開發需求,沒辦法。但是發現了經過代理之後發現網頁請求變慢了,而且是不能忍的一分鐘以上。
一開始,懷疑是在nodejs那邊的問題,結果在nodejs那邊進行了判斷(通過寫測試代碼),但是發現是經過了一分多鐘請求才到nodejs這邊,那麼只能先排除nodejs這方面的問題。
那麼要排除nginx的問題,我的環境是 windows7(x64) nginx(1.62) nodejs(4.23),配置如下
server {
listen 80;
server_name mysite.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://localhost:3333;
}
}
這是一個比較普通的配置,找不出來問題,那麼只能去找錯誤日志了,突然發現錯誤日志error.log裡面有這麼一段代碼
015/12/25 16:30:43 [error] 7652#7008: *1 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while connecting to upstream, client: 127.0.0.1, server
之前沒怎麼留意錯誤日志,罪過了啊,那麼既然發現了這個錯誤,找方法就簡單多了。
像是nodejs那邊沒有給nginx及時響應,那麼可以增加這幾個配置來解決(單位為秒)
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
這三個設置的定義是:
proxy_connect_timeout: 後端服務器連接的超時時間_發起握手等候響應超時時間
proxy_read_timeout: 連接成功後_等候後端服務器響應時間_其實已經進入後端的排隊之中等候處理(也可以說是後端服務器處理請求的時間)
proxy_send_timeout: 後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據
添加之後,就解決了,完整的是:
server {
listen 80;
server_name mysite.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_pass http://localhost:3333;
}
}