Nginx(發 音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下 發行。由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特色 是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰 訊,另外知名的微網誌Plurk也使用nginx。javascript
官方文檔:http://wiki.nginx.org/Mainphp
#運行用戶
user data;
#啓動進程,一般設置成和cpu的數量相等
worker_processes 1;css
#全局錯誤日誌及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;html
#工做模式及鏈接數上限
events {
use epoll; #epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能
worker_connections 1024;#單個後臺worker process進程的最大併發連接數
# multi_accept on;
}前端
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日誌格式
access_log /var/log/nginx/access.log;java
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
#必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
sendfile on;
#tcp_nopush on;node
#單個進程最大鏈接數(最大鏈接數=鏈接數*進程數)linux
worker_connections 65535;nginx
}web
#鏈接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啓gzip壓縮
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#設定請求緩衝
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
#設定負載均衡的服務器列表
upstream mysvr {
#weigth參數表示權值,權值越高被分配到的概率越大
#本機上的Squid開啓3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server {
#偵聽80端口
listen 80;
#定義使用www.xx.com訪問
server_name www.xx.com;
#設定本虛擬主機的訪問日誌
access_log logs/www.xx.com.access.log main;
#默認請求
location / {
root /root; #定義服務器的默認網站根目錄位置
index index.php index.html index.htm; #定義首頁索引文件的名稱
fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
#靜態文件,nginx本身處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
#過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。
expires 30d;
}
#PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
location ~ \.php$ {
root /root;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止訪問 .htxxx 文件
location ~ /\.ht {
deny all;
}
}
}
以上是一些基本的配置,使用Nginx最大的好處就是負載均衡
若是要使用負載均衡的話,能夠修改配置http節點以下:
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日誌格式
access_log /var/log/nginx/access.log;
#省略上文有的一些配置節點
#設定負載均衡的服務器列表
upstream mysvr {
#weigth參數表示權值,權值越高被分配到的概率越大
server 192.168.8.1x:3128 weight=5;#本機上的Squid開啓3128端口
server 192.168.8.2x:80 weight=1;
server 192.168.8.3x:80 weight=6;
}
upstream mysvr2 {
#weigth參數表示權值,權值越高被分配到的概率越大
server 192.168.8.x:80 weight=1;
server 192.168.8.x:80 weight=6;
}
#第一個虛擬服務器
server {
#偵聽192.168.8.x的80端口
listen 80;
server_name 192.168.8.x;
#對aspx後綴的進行負載均衡請求
location ~ .*\.aspx$ {
root /root; #定義服務器的默認網站根目錄位置
index index.php index.html index.htm; #定義首頁索引文件的名稱
proxy_pass http://mysvr ;#請求轉向mysvr 定義的服務器列表
#如下是一些反向代理的配置可刪除.
proxy_redirect off;
#後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #容許客戶端請求的最大單文件字節數
client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時)
proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
proxy_read_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時)
proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
}
}
}
#設定http服務器
http
{
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream; #默認文件類型
#charset utf-8; #默認編碼
server_names_hash_bucket_size 128; #服務器名字的hash表大小
client_header_buffer_size 32k; #上傳文件大小限制
large_client_header_buffers 4 64k; #設定請求緩
client_max_body_size 8m; #設定請求緩
sendfile on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。注意:若是圖片顯示不正常把這個改爲off。
autoindex on; #開啓目錄列表訪問,合適下載服務器,默認關閉。
tcp_nopush on; #防止網絡阻塞
tcp_nodelay on; #防止網絡阻塞
keepalive_timeout 120; #長鏈接超時時間,單位是秒
#FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模塊設置
gzip on; #開啓gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩衝區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端若是是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;
#壓縮類型,默認就已經包含textml,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #開啓限制IP鏈接數的時候須要使用
upstream blog.ha97.com {
#upstream的負載均衡,weight是權重,能夠根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的概率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虛擬主機的配置
server
{
#監聽端口
listen 80;
#域名能夠有多個,用空格隔開
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖片緩存時間設置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS緩存時間設置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日誌格式設定
log_format access ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" $http_x_forwarded_for‘;
#定義本虛擬主機的訪問日誌
access_log ar/loginx/ha97access.log access;
#對 "/" 啓用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#如下是一些反向代理的配置,可選。
proxy_set_header Host $host;
client_max_body_size 10m; #容許客戶端請求的最大單文件字節數
client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時)
proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
proxy_read_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時)
proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k如下的設置
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的內容能夠用apache提供的htpasswd工具來產生。
}
#本地動靜分離反向代理配置
#全部jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#全部靜態文件由nginx直接讀取不通過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}
server_name的匹配順序
Nginx中的server_name指令主要用於配置基於名稱虛擬主機,server_name指令在接到請求後的匹配順序分別爲:
一、準確的server_name匹配,例如:
server {
listen 80;
server_name ssdr.info www.ssdr.info;
...
}
二、以*通配符開始的字符串:
server {
listen 80;
server_name *.ssdr.info;
...
}
三、以*通配符結束的字符串:
server {
listen 80;
server_name www.*;
...
}
四、匹配正則表達式:
1. server {
2. listen 80;
3. server_name ~^(?.+)\.howtocn\.org$;
4. ...
5. }
Nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配之後就會中止搜索,因此咱們在使用這個指令的時候必定要分清楚它的匹配順序(相似於location指令)。
server_name指令一項很實用的功能即是能夠在使用正則表達式的捕獲功能,這樣能夠儘可能精簡配置文件,畢竟太長的配置文件平常維護也很不方便。下面是2個具體的應用:
在一個server塊中配置多個站點:
1. server
2. {
3. listen 80;
4. server_name ~^(www\.)?(.+)$;
5. index index.php index.html;
6. root /data/wwwsite/$2;
7. }
站點的主目錄應該相似於這樣的結構:
/data/wwwsite/ssdr.info
/data/wwwsite/linuxtone.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com
這樣就能夠只使用一個server塊來完成多個站點的配置。
在一個server塊中爲一個站點配置多個二級域名 。
實際網站目錄結構中咱們一般會爲站點的二級域名獨立建立一個目錄,一樣咱們可使用正則的捕獲來實如今一個server塊中配置多個二級域名:
server
{
listen 80;
server_name ~^(.+)?\.howtocn\.org$;
index index.html;
if ($host = ssdr.info)
{
rewrite ^ http://www.ssdr.info permanent;
}
root /data/wwwsite/ssdr.info/$1/;
}
站點的目錄結構應該以下:
/data/wwwsite/ssdr.info/www/
/data/wwwsite/ssdr.info/nginx/
這樣訪問www.ssdr.info時root目錄爲/data/wwwsite/ssdr.info/www/,nginx.ssdr.info時爲/data/wwwsite/ssdr.info/nginx/,以此類推。
後面if語句的做用是將ssdr.info的方位重定向到www.ssdr.info,這樣既解決了網站的主目錄訪問,又能夠增長seo中對www.ssdr.info的域名權重。
多個正則表達式
若是你在server_name中用了正則,而下面的location字段又使用了正則匹配,這樣將沒法使用$1,$2這樣的引用,解決方法是經過set指令將其賦值給一個命名的變量:
server
{
listen 80;
server_name ~^(.+)?\.howtocn\.org$;
set $www_root $1;
root /data/wwwsite/ssdr.info/$www_root/;
location ~ .*\.php?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwsite/ssdr.info/$fastcgi_script_name;
include fastcgi_params;
}
}
Nginx不一樣域名反向代理到另外一臺服務器 proxy_pass和$host
想 讓一個VPS專門作另外一個VPS的前端,後端VPS每添加一個域名,前端VPS就要同時添加一個域名來反向代理,做爲前端的VPS若是一個一個的添加後端 VPS的域名,那麼這個事情特別麻煩,能不能讓其自動反向代理後端VPS呢,用到proxy_pass和$host就能夠輕鬆實現。
如下例子爲了省事,以lnmp爲安裝環境進行設置
修改前端VPS的nginx.conf文件,修改爲如下內容:
server {
listen 80;
server_name $host;
location / {
proxy_pass http://www.31.gd/;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
下面的一併修改吧。
location /.(php|php5)?$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
location /status {
stub_status on;
access_log off;
}
location /.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location /.(js|css)?$
{
expires 12h;
}
這樣就能夠實現了前端VPS能夠反向代理任意域名到後端VPS,只要將域名解析到前端VPS,後端VPS進行域名綁定,那麼就能夠直接訪問到了
一臺nginx帶多個域名多個tomcat狀況的配置
多個域名,其中2個域名需支持泛域名解析:
一、www.abc.com
二、www.bcd.com
三、*.efg.com
四、*.hij.com
其中1,2,3爲一臺tomcat,4爲獨立tomcat。前端一臺nginx,經過配置多個虛擬主機來實現該部署。
進入/etc/nginx/conf.d目錄,全部虛擬主機的配置文件都在該目錄下存放,配置。
配置支持泛域名
server {
listen 81;
server_name *.efg.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 81;
server_name *.hij.com;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
泛域名解析關鍵爲紅色部分,若是沒有紅色部分,後端8080及8081口對應的tomcat虛擬主機將沒法得到域名信息,致使後端tomcat沒法獲取到對應的域名信息。
後端TOMCAT支持泛域名解析時,須要設置 host name 爲 localhost 以支持泛域名指向。
nginx綁定多個域名可又把多個域名規則寫一個配置文件裏,也可又分別創建多個域名配置文件,我通常爲了管理方便,每一個域名建一個文件,有些同類域名也可又寫在一個總的配置文件裏。
每一個域名一個文件
首先打開 nginx域名配置文件存放目錄:/usr/local/nginx/conf/servers ,如要綁定域名www.web126.com 則在此目錄建一個文件:www.web126.com.conf 而後在此文件中寫規則,如:
1. server
2. {
3. listen 80;
4. server_name www.web126.com; #綁定域名
5. index index.htm index.html index.php; #默認文件
6. root /home/www/web126.com; #網站根目錄
7. include location.conf; #調用其餘規則,也可去除
8. }
而後重起nginx服務器,域名就綁定成功了。