這篇文章主要介紹了關於Nginx的安裝與配置,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
Nginx學習實踐
一、選擇Nginx目的
高並發串連
官方測試nginx能夠支撐5萬並發串連,實際測試可以達到3萬左右,按照這樣計算,每天可以處理
億次訪問量,採用最新epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型;而achache則使用的是傳統的selelct
模型
記憶體消耗小
Nginx+php(FastCIGI)伺服器在3萬並發串連下,開啟10個nginx進程消耗150MB記憶體(15MB*10),開啟64個php-cgi
進程消耗1280MB記憶體(20MB*64),使用webbench做壓力測試,在3萬並發量速度依然很快。
Nginx支援負載平衡
Nginx支援反向 Proxy
成本低廉
相對於F5BIG-IP、NetScaler等硬體負載平衡交換器動輒10多萬設定幾十萬,可以免費使用,並且可以用於商業用途
Nginx請求的串連方法
select,poll,kqueue,epoll
二、安裝Nginx
準備環境
Linux系統是Centos 6.5 64位,我直接切換到root使用者下安裝
官方文檔:http://nginx.org/en/
su root
進入使用者目錄下載程式
cd /usr/local/src
現在相關組件
ngnix:wget http://nginx.org/download/nginx-1.13.12.tar.gzwget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gzwget http://zlib.net/zlib-1.2.11.tar.gzwget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
安裝c++編譯環境,如已安裝可略過
[root@localhost src]# yum install gcc-c++省略安裝內容...期間會有確認提示輸入y斷行符號Is this ok [y/N]:y省略安裝內容...
安裝Nginx及相關組件
openssl安裝[root@localhost src]# tar zxvf openssl-fips-2.0.10.tar.gz省略安裝內容...[root@localhost src]# cd openssl-fips-2.0.10[root@localhost openssl-fips-2.0.10]# ./config && make && make install省略安裝內容...pcre安裝[root@localhost src]# tar zxvf pcre-8.40.tar.gz省略安裝內容...[root@localhost src]# cd pcre-8.40[root@localhost pcre-8.40]# ./configure && make && make install省略安裝內容...zlib安裝[root@localhost src]# tar zxvf zlib-1.2.11.tar.gz省略安裝內容...[root@localhost src]# cd zlib-1.2.11[root@localhost zlib-1.2.11]# ./configure && make && make install省略安裝內容...nginx安裝:這裡的先增加一個nginx使用者組和一個nginx使用者例如:建立使用者加入ftp組,/sbin/nologin意思是使用者不允許登入(通過ftp可以串連),使用者名稱為nginxgroupadd -r ftpuseradd -s /sbin/nologin -g ftp -r nginx[root@localhost src]# tar zxvf nginx-1.13.12.tar.gz省略安裝內容...[root@localhost src]# cd nginx-1.13.12[root@localhost nginx-1.10.2]# ./configure --sbin-path=/usr/local/nginx/sbin \--conf-path=/usr/local/nginx/conf/nginx.conf \--pid-path=/usr/local/nginx/logs/nginx.pid \--with-http_ssl_module \--with-pcre=../pcre-8.40 \ #指向解壓的源碼目錄--with-zlib=../zlib-1.2.11 \ #指向解壓的源碼目錄--with-openssl=../openssl-2.0.10 \ #指向解壓的源碼目錄--with-http_stub_status_module \#啟用 nginx 的 NginxStatus 功能,用來監控 Nginx 的目前狀態--user=nginx \--group=nginx[root@localhost nginx-1.10.2]#make && make install省略安裝內容...
啟動Nginx
查看你的nginx安裝位置
whereis nginx
啟動、停止、重啟命令
啟動:/usr/local/nginx/sbin/nginx重啟:/usr/local/nginx/sbin/nginx -s reload停止:/usr/local/nginx/sbin/nginx -s stop
設定檔開啟、驗證
設定檔:vim /usr/local/nginx/conf/nginx.conf驗證設定檔:/usr/local/nginx/sbin/nginx -t
查看nginx進程
ps -aux | grep nginx
查看連接埠
netstat -tulnp | grep :80 查詢以80開頭的連接埠服務
如果看到進程了,在本地瀏覽器輸入:http://localhost就會看到歡迎介面;說明安裝成功了。
如果在別的機器訪問可以輸入nginx那台伺服器ip,不過你要確保80連接埠是開放的,後面配置ssl要確保443連接埠開放。
Nginx配置
1、進程配置:nginx開闢的進程數根據cpu的核心數來定
首先要查看cpu核心數命令:
cat /proc/cpuinfo
2.worker_connections串連數配置
網上建議:
如果nginx 中worker_connections 值設定是1024,worker_processes 值設定是4,按反向 Proxy模式下最大串連數的理論計算公式:最大串連數 = worker_processes * worker_connections/4
查看相關資料,生產環境中worker_connections 建議值最好超過9000,計劃將一台nginx 設定為10240,再觀察一段時間。
3.location配置
文法:location[=|~|~*|^~]/uri/{……}
預設值:no
使用欄位:server
這個參數根據uri的不同需求來進行配置,可以使用欄位串與Regex匹配,如果要使用Regex,你必須制定下列首碼
~:區分大小寫
~*:不區分大小寫
^~:禁止運算式匹配
=:精確匹配
例子:
location = / { #只匹配/的查詢 [configurationA]}location / { #匹配任務以/開始的查詢,但是Regex與一些較長的字串將被首先匹配 [configuration B ]}location ^~ /images/ { #匹配任何以/images/開始的查詢並停止搜尋,不檢查Regex [configuration C ]}location ~*.(gif|jpg|jpeg)$ { #匹配任何以gif,jpg,jpeg結尾的檔案,但是所有/images/目錄的請求將在configuration C中處理 [configuration D]}error_page 404 403 /404.html;location = /404.html { root /var/christy/www/web;}location /data { #開啟data瀏覽目錄 autoindex on;}#類似於別名location /i/ { #當訪問i的時候別名的路徑就是/data/w3/images/; alias /data/w3/images/;}
4.地址修正
Rewrite主要的功能就是實現URL的重寫,nginx的rewrite規則採用PCRE Perl相容Regex的文法進行規則匹配,如果需要nginx的rewrite功能,在編譯nginx之前,需要編譯安裝PCRE庫URL是統一資源定位器。如:http://www,linkwan.com/333/welcome.htmURI由一個通過通用資源標誌符進行定位。比如:333/welcome.htm地址修正用到的指令 if指令規則文法如果使用者的代理是微軟的msie(ie9以下),那麼在瀏覽器裡面輸入http://www.chrXXtyedu.cn/dd就會跳轉到http://www.christyedu.cn/msie/$1;ie10以上是Mozillaif ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break;}如果請求的檔案名稱不存在就重新導向到/site/$host/images/$1if(!-f $request_filename){ rewrite ^/img/(.*)$ /site/$host/images/$1 last;}location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.chrXXstyedu.cn chrXXtyedu.cn; if ($invalid_referer) { rewrite ^/(.*) http://www.test.com/333/welcome permanent; } //防盜鏈}設定限速location /download/ { limit_rate_after 500k; limit_rate 50k;}大概意思是:使用者下載達到 500k 後,便控制其速度在 50k 以內。
5.ssl配置
1_chrXXtyedu.cn_bundle.crt
2_chrXXtyedu.cn.key
這兩個檔案放在conf目錄下
一定要把443連接埠放開!!!!
server { listen 443 ssl; server_name www.chXXXtyedu.cn chrXXyedu.cn; ssl_certificate 1_chrXXtyedu.cn_bundle.crt; ssl_certificate_key 2_chrXXtyedu.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { root /var/chXXty/www/web-https; index index.html index.htm; } }
6.日誌管理
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; $http_x_forwarded_for和$remote_addr用戶端的ip地址(Proxy 伺服器,顯示代理服務ip) $remote_user用來記錄遠程用戶端使用者名稱稱 $time_local用來記錄訪問時間以及時區 $request用於記錄請求的URL與HTTP協議 $status用於記錄請求狀態,例如成功是狀態為200,頁面找不到時404 $body_bytes_sent用於記錄發送給用戶端的檔案主題內容大小 $http_referer用於記錄是從哪個頁面連結訪問過來的 $http_user_agent用於記錄用戶端瀏覽器的相關資訊
7.介紹部分緩衝
open_log_file_cache指令文法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];open_log_file_cache off;預設值: open_log_file_cache off;配置段: http, server, location對於每一條日誌記錄,都將是先開啟檔案,再寫入日誌,然後關閉。可以使用open_log_file_cache來設定記錄檔緩衝(預設是off),格式如下:參數注釋如下:max:設定緩衝中的最大檔案描述符數量,如果緩衝被佔滿,採用LRU演算法將描述符關閉。inactive:設定存活時間,預設是10smin_uses:設定在inactive時間段內,記錄檔最少使用多少次後,該記錄檔描述符記入緩衝中,預設是1次valid:設定檢查頻率,預設60soff:禁用緩衝執行個體如下:代碼如下:open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;http { client_max_body_size 300m; client_body_buffer_size 600; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 16k; proxy_buffers 4 32k; proxy_busy_buffers_size 64; proxy_temp_file_write_size 64k; } 允許用戶端請求的最大的單個檔案位元組數 client_max_body_size 緩衝區代理緩衝使用者端請求的最大位元組數 可以理解為先儲存到本地再傳給使用者 client_body_buffer_size 跟後端伺服器串連的逾時時間 發起握手等候響應逾時時間 proxy_connect_timeout 串連成功後_等候後端伺服器回應時間_其實已經進入後端的排隊之中等候處理 proxy_read_timeout 後端伺服器資料回傳時間_就是在規定時間之內後端伺服器必須傳完所有的資料 proxy_send_timeout 代理請求緩衝區_這個緩衝區間會儲存使用者的頭資訊以供Nginx進行規則處理_一般只要能儲存下頭資訊即可 proxy_buffer_size 16k 同上告訴Nginx儲存單個用的幾個Buffer及最大用多大空間 proxy_buffers 4 32k 如果系統很忙的時候可以申請更大的proxy_bufers 官方推薦*2 proxy_busy_buffers_size 64k; proxy緩衝臨時檔案的大小 proxy_temp_file_write_size 64k; location /sms { proxy_pass http://127.0.0:8080; #設定Host是真實瀏覽器的,而不是代理的 proxy_set_header Host $host; proxy_cache cache_one; #佈建要求ip是真實的ip,而不是代理的 proxy_set_header X-Forwarded-For $remote_addr; }
8.代理,反向 Proxy和負載平衡
正向 Proxy的概念
正向 Proxy,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個使用者,我訪問不了某網站,但是我能訪問一個Proxy 伺服器這個Proxy 伺服器呢,他能訪問那個我不能訪問的網站於是我先連上Proxy 伺服器,告訴他我需要那個無法訪問網站的內容Proxy 伺服器去取回來,然後返回給我正常情況: client —(send request)—> server代理情況: client —(send request)—> clinet proxy –(send request)—> server
什麼又是反向 Proxy
正向 Proxy中代理的過程是用戶端,代理機器是作為一個訪問客戶的身份的;而在反向 Proxy中代理機器是作為服務身份。正向 Proxy中代理的過程是用戶端,服務端對代理的存在無感知;而在反向 Proxy中客戶機對代理的存在無感知。反向 Proxy情況: clinet –(send request)–> server proxy –(send request)–>other server
Nginx集反向 Proxy和負載平衡於一身,在設定檔中修改配就可以實現upstream xxx{};upstream模組是命名一個後端伺服器組,組名必須為(proxy_pass的名稱)後端伺服器網站網域名稱,內部可以寫多台伺服器ip和port,還可以設定跳轉規則及權重等等proxy_pass;代表後端伺服器組名,此組名必須為後端伺服器網站網域名稱server_name和upstream{}的組名可以不一致,server_name是外網訪問接收請求的網域名稱,upstream{}的組名是跳轉後端伺服器時網站訪問的網域名稱upstream chxxty_server { server 119.29.54.177:8081 weight=5; server 119.29.54.177:8080 weight=10 max_fails=3 fail_timeout=30s;} server { listen 443 ssl; server_name www.chXXtyedu.cn chxxxedu.cn; ssl_certificate 1_chxxtyedu.cn_bundle.crt; ssl_certificate_key 2_chxxyedu.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } location ~ .* { proxy_pass http://chxxty_server; #設定Host是真實瀏覽器的,而不是代理的 proxy_set_header Host $host; #佈建要求ip是真實的ip,而不是代理的 proxy_set_header X-Forwarded-For $remote_addr; }}
祝大家成功!