歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
 Linux教程網 >> Linux基礎 >> 關於Linux >> linux安裝配置nginx

linux安裝配置nginx

日期:2017/3/1 11:49:07      编辑:關於Linux
linux安裝配置nginx其實很簡單

#獲取

[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的集群與負載均衡算法.

Copyright © Linux教程網 All Rights Reserved