#獲取
[root@template tmp]#wget http://nginx.org/download/nginx-1.9.15.tar.gz
#解壓到指定目錄
[root@template tmp]# tar -zxvf nginx-1.9.15.tar.gz -C /usr/local/
#安裝之前必須先安裝依賴
[root@template tmp]yum install pcre pcre-devel
[root@template tmp]cd /usr/local/nginx-1.9.15
#安裝到/usr/local/nginx目錄
[root@template nginx-1.9.15]./configure --prefix=/usr/local/nginx
#編譯安裝
[root@template nginx-1.9.15]make && make install
[root@template nginx-1.9.15]cd /usr/local/nginx/sbin/
[root@template sbin]./nginx #啟動
[root@template sbin]netstat -lnp|grep 80 #查看80端口
[root@template sbin]# netstat -lnp|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3091/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 1380/dhclient
[root@template sbin]# curl 127.0.0.1 #也可以這麼看一下
... ...
Thank you for using nginx.
[root@template sbin]#
cd /usr/local/nginx, 看到如下4個目錄
./
….conf 配置文件
… html 網頁文件
…logs 日志文件
…sbin 主要二進制程序
如果出現
[root@localhost sbin]# ./nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
....
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
不能綁定80端口,80端口已經被占用
把占用80端口的軟件或服務關閉即可
PS: Windows7下80端口被占用是系統進程,需要修改注冊表,具體百度一下。
打開RegEdit:開始-運行-輸入regedit-調出注冊表
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP
找到一個DWORD值Start,將其改為0
重啟電腦,System進程將不會占用80端口
Nginx的信號控制
TERM, INT Quick shutdown
QUIT Graceful shutdown 優雅的關閉進程,即等請求結束後再關閉
HUP Configuration reload ,Start the new worker processes with
a new configuration Gracefully shutdown the old worker processes
改變配置文件,平滑的重讀配置文件
USR1 Reopen the log files 重讀日志,在日志按月/日分割時有用
USR2 Upgrade Executable on the fly 平滑的升級
WINCH Gracefully shutdown the worker processes 優雅關閉舊的進程(配合USR2來進行升級)
具體語法:
Kill -信號選項 nginx的主進程號(/usr/local/nginx/logs/nginx.pid文件)
Kill -信號控制 cat /usr/local/nginx/logs/nginx.pid
Kill -HUP 4873
等效於
kill -HUP cat /usr/local/nginx/logs/nginx.pid
改變配置文件,平滑的重讀配置文件 常用
Kill -USR1 cat /usr/local/nginx/logs/nginx.pid
Nginx配置段
// 全局區
worker_processes 1; // 有1個工作的子進程,可以自行修改,但太大無益,因為要爭奪CPU,一般設置為 CPU數*核數
Event {
// 一般是配置nginx連接的特性
// 如1個word能同時允許多少連接
worker_connections 1024; // 這是指 一個子進程最大允許連1024個連接
}
http { //這是配置http服務器的主要段
Server1 { // 這是虛擬主機段
Location { //定位,把特殊的路徑或文件再次定位 ,如image目錄單獨處理
} /// 如.php單獨處理
}
Server2 {
}
}
例子1: 基於域名的虛擬主機
server {
listen 80; #監聽端口
server_name a.com; #監聽域名
location / {
root /var/www/a.com; #根目錄定位
index index.html;
}
}
例子2: 基於端口的虛擬主機配置
server {
listen 8080;
server_name 192.168.1.204;
location / {
root /var/www/html8080;
index index.html;
}
}
nginx日志切割
#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p /data/logs/nginxlogs/$log_path
mv $base_path/access.log /data/logs/nginxlogs/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
添加定時任務
crontab -e
00 2 * * * /home/sh/generateNingxLog.sh 文件路徑 記得更改權限
location 語法
location 有”定位”的意思, 根據Uri來進行不同的定位.
在虛擬主機的配置中,是必不可少的,location可以把網站的不同部分,定位到不同的處理方式上.
比如, 碰到.php, 如何調用PHP解釋器? --這時就需要location
location 的語法
location [=|~|~*|^~] patt {
}
中括號可以不寫任何參數,此時稱為一般匹配
也可以寫參數
因此,大類型可以分為3種
location = patt {} [精准匹配]
location patt{} [一般匹配]
location ~ patt{} [正則匹配]
正則匹配最長的
找到localtion 後會繼續匹配正則,並且匹配最長的
rewrite 重寫
重寫中用到的指令
if (條件) {} 設定條件,再進行重寫
set #設置變量
return #返回狀態碼
break #跳出rewrite
rewrite #重寫
If 語法格式
If 空格 (條件) {
重寫模式
}
條件又怎麼寫?
答:3種寫法
1: “=”來判斷相等, 用於字符串比較
2: “~” 用正則來匹配(此處的正則區分大小寫)
~* 不區分大小寫的正則
3: -f -d -e來判斷是否為文件,為目錄,是否存在.
例子:
if ($remote_addr = 192.168.1.100) {
return 403;
}
if ($http_user_agent ~ MSIE) {
rewrite ^.*$ /ie.htm;
break; #(不break會循環重定向)
}
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html break;
}
注, 此處還要加break,
以 xx.com/dsafsd.html這個不存在頁面為例,
我們觀察訪問日志, 日志中顯示的訪問路徑,依然是GET /dsafsd.html HTTP/1.1
提示: 服務器內部的rewrite和302跳轉不一樣.
跳轉的話URL都變了,變成重新http請求404.html, 而內部rewrite, 上下文沒變,
就是說 fastcgi_script_name 仍然是 dsafsd.html,因此 會循環重定向.
set 是設置變量用的, 可以用來達到多條件判斷時作標志用.
達到apache下的 rewrite_condition的效果
如下: 判斷IE並重寫,且不用break; 我們用set變量來達到目的
if ($http_user_agent ~* msie) {
set $isie 1;
}
if ($fastcgi_script_name = ie.html) {
set $isie 0;
}
if ($isie 1) {
rewrite ^.*$ ie.html;
}
注意:用url重寫時, 正則裡如果有”{}”,正則要用雙引號包起來
網頁內容的壓縮編碼與傳輸速度優化
gzip配置的常用參數
gzip on|off; #是否開啟gzip
gzip_buffers 32 4K| 16 8K #緩沖(壓縮在內存中緩沖幾塊? 每塊多大?)
gzip_comp_level [1-9] #推薦6 壓縮級別(級別越高,壓的越小,越浪費CPU計算資源)
gzip_disable #正則匹配UA 什麼樣的Uri不進行gzip
gzip_min_length 200 # 開始壓縮的最小長度(再小就不要壓縮了,意義不在)
gzip_http_version 1.0|1.1 # 開始壓縮的http協議版本(可以不設置,目前幾乎全是1.1協議)
gzip_proxied # 設置請求者代理服務器,該如何緩存內容
gzip_types text/plain application/xml # 對哪些類型的文件用壓縮 如txt,xml,html ,css
gzip_vary on|off # 是否傳輸gzip壓縮標志
Nginx具體的壓縮配置
常用以下配置
gzip on|off
gzip_buffers 4K|8K 緩沖(和硬盤塊相當)
gzip_comp_level [1-9] 推薦6
gzip_disable 正則匹配如User-Agent,針對古老浏覽器不壓縮
gzip_min_length 200
gzip_http_version 1.0|1.1
gzip_types text/plain , application/xml (各mime之間,一定要加空格,不是逗號)
gzip_vary on|off
nginx的緩存設置 提高網站性能
對於網站的圖片,尤其是新聞站, 圖片一旦發布, 改動的可能是非常小的.我們希望 能否在用戶訪問一次後, 圖片緩存在用戶的浏覽器端,且時間比較長的緩存.
可以, 用到 nginx的expires設置 .
nginx中設置過期時間,非常簡單,
在location或if段裡,來寫.
格式 expires 30s;
expires 30m;
expires 2h;
expires 30d;
(注意:服務器的日期要准確,如果服務器的日期落後於實際日期,可能導致緩存失效)
另: 304 也是一種很好的緩存手段
原理是: 服務器響應文件內容是,同時響應etag標簽(內容的簽名,內容一變,他也變), 和 last_modified_since 2個標簽值
浏覽器下次去請求時,頭信息發送這兩個標簽, 服務器檢測文件有沒有發生變化,如無,直接頭信息返回 etag,last_modified_since
浏覽器知道內容無改變,於是直接調用本地緩存.
這個過程,也請求了服務器,但是傳著的內容極少.
對於變化周期較短的,如靜態html,js,css,比較適於用這個方式
nginx反向代理服務器+負載均衡
用nginx做反向代理和負載均衡非常簡單,
支持兩個用法 1個proxy, 1個upstream,分別用來做反向代理,和負載均衡
以反向代理為例, nginx不自己處理php的相關請求,而是把php的相關請求轉發給apache來處理.
—-這不就是傳說的”動靜分離”,動靜分離不是一個嚴謹的說法,叫反向代理比較規范.
反向代理後端如果有多台服務器,自然可形成負載均衡,
但proxy_pass如何指向多台服務器?
把多台服務器用 upstream指定綁定在一起並起個組名,
然後proxy_pass指向該組
默認的均衡的算法很簡單,就是針對後端服務器的順序,逐個請求.
也有其他負載均衡算法,如一致性哈希,需要安裝第3方模塊.
nginx 與memcached的組合
用法: nginx響應請求時,直接請求memcached,
如果沒有相應的內容,再回調PHP頁面,去查詢database,並寫入memcached.
分析: memcached是k/v存儲, key–>value,
nginx請求memecached時,用什麼做key?
一般用 uri arg 做key, 如 /abc.php?id=3
Nginx 第三方模塊的安裝
以ngx_http_php_memcache_standard_balancer-master為例
1:解壓 到 path/ngx_module
配置:
./configure –prefix=/xxx/xxx –add_module=/path/ngx_module
編譯 安裝
Make && make instal
配置memcache集群
upstream memserver { 把用到的memcached節點,聲明在一個組裡
hash_key $request_uri; // hash計算時的依據,以uri做依據來hash
server localhost:11211;
server localhost:11212;
}
Location裡
location / {
# root html;
set memcachedkeyuri;
memcached_pass memserver; // memserver為上面的memcache節點的名稱
error_page 404 /writemem.php;
index index.php index.html index.htm;
}
在nginx中做集群與負載均衡,步驟都是一樣的
Upstream {}模塊 把多台服務器加入到一個組
然後 memcached_pass, fastcgi_pass, proxy_pass ==> upstream組
默認的負載均衡的算法:
是設置計數器,輪流請求N台服務器.
可以安裝第3方模式,來利用uri做hash等等.
如http://wiki.nginx.org/NginxHttpUpstreamConsistentHash
這個模塊就是用一致性hash來請求後端結節,並且其算法,與PHP中的memcache模塊的一致性hash算法,兼容.
安裝該模塊後:
Nginx.conf中
upstream memserver {
consistent_hash $request_uri;
server localhost:11211;
server localhost:11212;
}
在PHP.ini中,如下配置
memcache.hash_strategy = consistent
這樣: nginx與PHP即可完成對memcached的集群與負載均衡算法.