Nginx是一個輕量級並有着高性能的http和反向代理服務器,它對高併發靜態內容的請求有着高效的處理性能。採用epoll屬於非阻塞過程調用模型,一個工作進程可以響應多個請求。
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。官網地址:nginx.org
主進程主要完成如下工作:
讀取並驗正配置信息;
創建、綁定及關閉套接字;
啓動、終止及維護worker進程的個數;
無須中止服務而重新配置工作特性;
控制非中斷式程序升級,啓用新的二進制程序並在需要時回滾至老版本;
重新打開日誌文件,實現日誌滾動;
編譯嵌入式perl腳本;
worker進程主要完成的任務包括:
接收、傳入並處理來自客戶端的連接;
提供反向代理及過濾功能;
nginx任何能完成的其它任務;
cache loader進程主要完成的任務包括:
檢查緩存存儲中的緩存對象;
使用緩存元數據建立內存數據庫;
cache manager進程的主要任務:
緩存的失效及過期檢驗;
安裝Nginx:
先安裝pcre-devel:yum install pcre-devel -y
tar xf nginx-1.6.0.tar.gz
cd nginx-1.6.0
開始編譯:
# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
make && make install
編寫服務腳本,放置/etc/init.d目錄,前面文章已經有很多服務腳本的例子,這裏省略。
而後爲此腳本賦予執行權限:
chmod +x /etc/rc.d/init.d/nginx
添加至服務管理列表,並讓其開機自動啓動:
chkconfig --add nginx
chkconfig nginx on
而後就可以啓動服務並測試了:
service nginx start
來看看nginx的主配置文件/etc/nginx/nginx.conf
全局配置的常用指令
worker_processes 1 定義worker進程的個數,一般爲cpu的兩倍。
events{
use epoll
worker_connections number; 一個Worker進程的最大連接數
}
#clients= worker_connections * work_processes
worker_cpu_affinity 0001 0010 0100 1000; 綁定CPU核心,避免了上下文切換。
worker_rlimit_nofile number; 51200 調整每個用戶所能打開的文件數量。
/etc/security/limits.conf 也可以通過修改配置文件調整。
worker_priority -5; 定義進程優先級
http {
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream; #默認文件類型
#charset utf-8; #默認編碼
server_names_hash_bucket_size 128; #服務器名字的hash表大小
sendfile on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
autoindex on; #開啓目錄列表訪問,合適下載服務器,默認關閉。
tcp_nopush on; #防止網絡阻塞
tcp_nodelay on; #防止網絡阻塞
keepalive_timeout 5; 持久連接超時時間
server{
listen 80;
index index.html index.htm index.php; 定義主頁
root /web; 定義主目錄
Server_name 定義虛擬主機名
= 精確匹配
location = /images/ {
}
~ 模式匹配,區分模式中的字符大小寫
~* 模式匹配,不區分大小寫
location ~* \.jpg$ {
} 任何以.jpg結尾的都匹配。
^~ 不做模式匹配
autoindex on 開啓目錄索引
autoindex_exact_size on 顯示精確大小
autoindex_localtime on 顯示文件的訪問時間
Error_page 404 /404.html 自定義錯誤頁面文件
Error_page 500 502 504 /50x.html
Log_format 日誌格式
Access_log 訪問日誌
}
}
}
配置一個基於名稱的虛擬主機。
server {
listen 80;
server_name www.tuchao.com;
root '/web/tuchao';
index index.html;
}
配置對/web/tuchao/secret/路徑做訪問控制。
server {
listen 80;
server_name www.tuchao.com;
root '/web/tuchao';
index index.html;
location /secret {
root '/web/tuchao';
auth_basic "tuchao's secret";
auth_basic_user_file '/etc/nginx/.htpasswd';
}
}
htpasswd -c -s /etc/nginx/.htpasswd tuchao 生成用戶文件
service nginx reload
訪問下試試:
輸入正確的用戶名密碼後,就可以看到內容了。
配置路徑別名(alias)
添加自定義響應首部(add_header 模塊)
用google瀏覽器訪問,按F12打開開發人員工具,查看下。
Rewrite URL重寫,修改原本請求的位置
控制標誌:
Last:當我們把URL重寫完成後,它會重啓檢查模塊,從頭再檢查一遍
Break:重寫完成後,停止當前的進程,繼續檢查下一個,以避免循環重寫。
Redirect:臨時重定向,顯示重定向。重定向完成,從頭再檢查。
Permanent:返回永久重定向。
example:www.tuchao.com/bbs/index.php ----> www.tuchao.com/www/html/index.html
我們現在訪問下:http://www.tuchao.com/bbs/index.html,在服務器上,是沒有bbs這個目錄的,訪問當然是not found。
現在我們去配置URL重寫
然後reload服務,再試試看。
啓用status功能:
訪問www.tuchao.com/status
構建LNMP環境,先安裝MySQL,然後把php編譯成fpm.
安裝MySQL過程略。。
編譯PHP之前,先安裝依賴包。
bzip2-1.0.5-7.el6_0.i686.rpm
bzip2-devel-1.0.5-7.el6_0.i686.rpm
libmcrypt-2.5.8-4.el5.centos.i386.rpm
libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm
mhash-0.9.9-1.el5.centos.i386.rpm
mhash-devel-0.9.9-1.el5.centos.i386.rpm
mcrypt-2.6.8-1.el5.i386.rpm
libxml2-devel
libcurl-devel
libcurl
開始編譯:
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl
make && make install
爲php提供配置文件:
cp php.ini-production /etc/php.ini
爲php-fpm提供Sysv init腳本,並將其添加至服務列表:
cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
爲php-fpm提供配置文件:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
編輯php-fpm的配置文件:
vim /usr/local/php/etc/php-fpm.conf
配置fpm的相關選項爲你所需要的值,並啓用pid文件(如下最後一行):
pm.max_children = 150
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pid = /usr/local/php/var/run/php-fpm.pid
接下來可以啓動php-fpm了:
service php-fpm start
整合nginx和php5
1、編輯/etc/nginx/nginx.conf,啓用如下選項:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
2、編輯/etc/nginx/fastcgi_params,將其內容更改爲如下內容:
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
並在所支持的主頁面格式中添加php格式的主頁,類似如下:
location / {
root html;
index index.php index.html index.htm;
}
而後重新載入nginx的配置文件:
service nginx reload
通過瀏覽器訪問此測試頁面。php頁面執行成功。
配置反向代理服務器(proxy)
成功轉發至192.168.18.100
查看192.168.18.100主機的日誌
由此發現,記錄的是我們nginx服務器的地址,沒有記錄到請求端的地址,這樣一來記錄日誌將變得沒有意義,接下來我們來解決這個問題。
編輯nginx.conf文件
編輯192.168.18.100主機的httpd.conf文件
刷新幾次頁面,再看下日誌,現在是記錄請求端的IP了。
使用反向代理實現動靜分離
我們訪問192.168.18.200/11.jpg,由於這個請求是靜態的,會轉到192.168.18.100。
當我們請求192.168.18.200/index.php時,這個請求會轉發至127.0.0.1:9000,當然這也可以是一個遠端主機的地址,這就實現了,反向代理動靜分離。
調用upstream模塊,配置負載均衡。
然後我們仍然訪問,nginx服務器地址192.168.18.200,請求就會輪詢的轉至不同的服務器上去了。
本來做負載均衡兩臺服務器應該是要一樣的內容,我們這裏實驗,爲了更好驗證效果所以設置了不同的內容。
有問題歡迎與我交流QQ1183710107