一.介紹安裝 公司由於linux雲伺服器還沒批下來,暫時先在windows伺服器上測試。Windows版nginx使用本地Win32 API(而非Cygwin模擬層)。當前僅使用select()和poll()(1.15.9)連接處理方法(事件驅動模型),因此不應期望高性能和可伸縮性(在linux上支 ...
一.介紹安裝
公司由於linux雲伺服器還沒批下來,暫時先在windows伺服器上測試。Windows版nginx使用本地Win32 API(而非Cygwin模擬層)。當前僅使用select()和poll()(1.15.9)連接處理方法(事件驅動模型),因此不應期望高性能和可伸縮性(在linux上支持epoll,它是性能最高的一種)。由於這個原因和其他一些已知問題,適用於Windows的Nginx版本被認為是Beta版本。目前,除了XSLT過濾器,圖像過濾器,GeoIP模塊和嵌入式Perl語言之外,它提供的功能幾乎與UNIX版本的nginx相同。
1.1下載安裝
windows下載安裝包1.17.7
http://nginx.org/en/download.html
啟動nginx, 沒有找到nginx.exe進程,
C:\Users\Administrator>cd C:\nginx-1.17.7 C:\nginx-1.17.7>start nginx
查看日誌C:\nginx-1.17.7\logs
2020/01/03 13:55:53 [emerg] 11992#35328: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
1.2 查看誰占用了80埠
C:\nginx-1.17.7>netstat -ano|findstr "80"
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
可能是http,查看下http服務狀態:
C:\nginx-1.17.7>netsh http show servicestate
發現6468占用了,再查看任務管理器,是IIS占用了,如下所示:
1.3 解決windows 80埠被iis占用
方法1,啟動欄輸入regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP
將start 的3改為0
重啟伺服器,
方法2:直接關閉iis中的預設站點 Default Web Site
再次啟動 查看進程狀態 tasklist /fi "imagename eq nginx.exe"
一個是主進程(守護進程),另一個工作進程
訪問http://127.0.0.1/,查看nginx首頁
1.4 nginx 命令管理
nginx -s stop 快速結束服務
nginx -s quit 正常結束服務
nginx -s reload 更改配置,使用新配置啟動新工作進程,正常關閉舊工作進程
nginx -s reopen 重新打開日誌文件
Nginx/Win32是運行在一個控制台程式,而非windows服務方式的。
1.5其它事項
日誌文件,如果是debug級別,日誌文件會增長的比較快。需要更大的磁碟目錄空間。
二. windows下nginx.conf配置示例
#預設所有用戶都能啟動nginx進程 #user nobody; #worker進程數,配置對應cpu核心數 worker_processes 1; #伺服器錯誤日誌 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #主進程,也叫守護進程pid存放路徑 #pid logs/nginx.pid; #有預設的事件驅動模型 events { #每個worker進程的最大連接數 worker_connections 1024; accept_mutex on; #預設為on,解決"驚群"問題 } http { #識別web資源類型,引入外部 mime.types文件,路徑在conf/mime.types下 include mime.types; #預設資源類型 default_type application/octet-stream; #自定義服務日誌,這裡記錄前端請求的日誌,而不是全局中nginx進程運行的常規日誌 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #訪問日誌,main是log_format格式字元串 #access_log logs/access.log main; #方式轉輸方式,轉輸的數據最大量不能超過sendfile_max_chunk 128k sendfile on; #tcp_nopush on; #設置格式 charset utf-8; #配置連接超時時間 #keepalive_timeout 0; keepalive_timeout 65; #預設開啟gzip壓縮 #gzip on; # 緩存設置,基於proxy_cache機制 #path緩存目錄 #levels相對於path指定目錄的第幾級hash目錄中緩存數據文件,目錄層級2級, #keys_zone索引記憶體區功能變數名稱稱 10m是大小 #max_size硬碟中緩存數據的大小限制(超過啟動nginx自己的淘汰規則), #inactive在60分鐘的時間內沒有被訪問就會被清理,存放臨時文件 #use_temp_path 關閉 proxy_cache_path cache levels=1:2 keys_zone=ABC_cache:10m max_size=5g inactive=60m use_temp_path=off; # HTTP server 監聽 www.ABC.com server { listen 80; #監聽埠 server_name www.ABC.com; #創建獨立的日誌,重點:手動在logs下創建www.ABC.com文件夾 access_log logs/www.ABC.com/access.log; error_log logs/www.ABC.com/error.log; #charset koi8-r; location / { #root html; #index index.html index.htm; #緩存設置 proxy_cache ABC_cache; proxy_cache_methods GET HEAD POST; proxy_cache_valid 200 304 60m; #200和304頭信息過期時間 proxy_cache_valid 404 1m; proxy_cache_valid any 10m; #其他過期時間10分鐘 expires 2h; proxy_pass http://ABCservers; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { #目錄是本機web伺服器靜態資源目錄 root D:\\www\www.ABC.com\wwwroot; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # HTTPS server 監聽apicms.ABC.com埠 server { listen 443 ssl; server_name apicms.ABC.com; #創建獨立的日誌,重點:手動在logs下創建apicms.ABC.com文件夾 access_log logs/apicms.ABC.com/access.log; error_log logs/apicms.ABC.com/error.log; ssl_certificate ./ssl/apicms.ABC.com.crt; ssl_certificate_key ./ssl/apicms.ABC.com.rsa; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; proxy_pass https://apicmsservers; proxy_set_header Connection keep-alive; proxy_set_header Host $host; #web伺服器端獲得用戶的真實ip request.getAttribute("X-Real-IP") proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-Port $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } #apicms後端伺服器組,如果一個伺服器處理請求出錯,會順次交給組內下一個伺服器進行處理,以此類推 upstream apicmsservers{ #當某個server請求二次失敗後,10分鐘以不會把請求發往已檢查出標記為不可用的伺服器 server 127.0.0.1:44301 max_fails=2 fail_timeout=600s weight=5; server 192.168.0.125:44301 max_fails=2 fail_timeout=600s weight=5; } #官網後端伺服器組 upstream ABCservers{ server 127.0.0.1:8081 max_fails=2 fail_timeout=600s weight=5; server 192.168.0.125:8081 max_fails=2 fail_timeout=600s weight=5; } }
(1) https協議需要證書, 將申請的.pfx證書使用openssl工具,將轉換成crt和rsa文件。再放在nginx目錄的ssl文件夾下,轉換示例如下:
openssl >pkcs12 -in D:\SSL\1717704_apicms.ABC.com.pfx -clcerts -nokeys -out D:\SSL\apicms.ABC.com.crt
openssl >pkcs12 -in D:\SSL\1717704_apicms.ABC.com.pfx -nocerts -nodes -out D:\SSL\apicms.ABC.com.rsa
(2)配置中所有相對路徑,都是nginx目錄下的。 比如:logs/ , proxy_cache_path cache , ./ssl
(3) 如果沒有購買功能變數名稱綁定當前nginx伺服器ip, 那麼測試需要在nginx伺服器上使用hosts文件。才能監聽server塊的虛擬主機名,hosts綁定如下所示:
127.0.0.1 apicms.ABC.com
127.0.0.1 www.ABC.com
再ping下確認,hosts文件是否生效
參考資料
http://nginx.org/en/docs/windows.html