Nginx介紹php
nginx www服務軟件 俄羅斯人開發 開源 性能很高 web產品 大小780k c語言開發 自己是一款靜態www軟件,不能解析php jsp .do 最大特色 靜態小文件(1m),支持高併發,佔用資源少 3w併發,10個進程,內存150M(unix、linux、windows都支持) crtl -I 域名 返回的http信息能夠看到使用的web服務器 其餘特色 1、配置簡單、靈活、輕量 2、高併發小文件,靜態幾萬併發 3、功能種類多,可是每一個功能都不是特別強 4、支持epoll模型,使得nginx支持高併發。apache 使用select模型() 宿舍大媽案例,有朋友來宿舍找你 select即大媽帶你逐一挨個去每一個房間找(即線性輪迴) epoll即大媽找宿舍人員名單,房間號信息,告訴你房間號(回調callback) 因此大併發鏈接時select性能就降低 5、nginx能夠配合動態服務(fastcgi接口) 6、利用nginx能夠對ip限速,能夠限制鏈接數 另外 基於名字端口及ip的多虛擬主機站點 支持rewrite及正則 支持基於客戶端ip地址和http基本認證的訪問控制 支持http響應速率限制 支持同一ip地址的併發鏈接或請求數限制 通常網站併發依賴以下 nginx 1-3w併發 php 300-800 db 300-800 nginx服務從大的方面的功能: a、web服務,郵件服務 b、負載均衡(反向代理) c、web cache(web緩存),至關於squid(CDN主要使用) nginx的應用場合 1、靜態服務(圖片,視頻)是另外一個lighttpd。併發:幾萬併發html js css flv jpg gif 2、動態服務 nginx+fastcgi方式運行php,jsp,動態併發500-1500(apache+php lighttpd+fastcgi) 3、反向代理,負載均衡。日pv2000w如下,併發1w如下均可以直接用nginx作代理 (其餘代理haproxy軟件,F5 ,A10) 4、緩存服務,相似squid varnish ats nginx支持虛擬主機,一個server標籤就是一個虛擬機 1、基於域名的虛擬主機 經過域名來區分虛擬主機 應用於外部網站 2、基於端口的虛擬主機 經過端口來區分虛擬主機 內部網站 網站後臺 3、基於ip的虛擬主機 幾乎不用,不支持ifconfig別名,配置文件能夠
2017-05-30
nginx-1.13.1 mainline version has been released.
2017-04-12
nginx-1.12.0 stable versioncss
NGINX安裝(1.8.1)html
1、安裝PCRE (Perl Compatible Regular Expressions) PCRE 中文perl兼容正則表達式,HTTP rewrite module requires the PCRE library # yum install pcre pcre-devel -y 2、安裝OPENSSL SSL modules require the OpenSSL library # yum install openssl-devel -y 開始安裝nginx a、添加用戶 #useradd nginx -s /sbin/nologin -M b、配置安裝 tar -zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure --prefix=/usr/local/nginx-1.8.1 --user=nginx --group=nginx \ --with-http_stub_status_module --with-http_ssl_module make && make install ln -s /usr/local/nginx-1.8.1/ /usr/local/nginx
c、啓動 # /usr/local/nginx/sbin/nginx d、查看進程 # ps -ef | grep nginx | grep -v grep root 1713 1 0 23:47 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 1714 1713 0 23:47 ? 00:00:00 nginx: worker process e、查看nginx編譯參數及版本 /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.8.1 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx-1.8.1 --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
配置3個虛擬主機實踐node
#mkdir -p /usr/local/nginx/html/{bbs,www,blog} 用於放置虛擬主機網頁目錄 #echo "www.gtms.org" > /usr/local/nginx/html/www/index.html #echo "bbs.gtms.org" > /usr/local/nginx/html/bbs/index.html #echo "blog.gtms.org" > /usr/local/nginx/html/blog/index.html #mkdir /usr/local/nginx/conf/extra 用於放置虛擬主機配置文件目錄
在extra目錄先創建站點配置文件 www.conf/bbs.conf/blog.conf,內容以下 root@node83 extra]# cat www.conf bbs.conf blog.conf #www.conf server { listen 80; server_name www.gtms.org; location / { root html/www; index index.html; } } #bbs.conf server { listen 80; server_name bbs.gtms.org; location / { root html/bbs; index index.html; } } #blog.conf server { listen 80; server_name blog.gtms.org; location / { root html/blog; index index.html; } } #vi /usr/local/nginx/conf/nginx.conf 在http標籤段加入如下內容 include extra/www.conf; include extra/bbs.conf; include extra/blog.conf; #/usr/local/nginx/sbin/nginx -t 檢查ok後# /usr/local/nginx/sbin/nginx -s reload
從另外一臺主機配置hosts文件進行測試
[root@node82 nginx]# curl 192.168.0.83 經過ip訪問默認走第一個配置的主機
www.gtms.org
[root@node82 nginx]# curl www.gtms.org
www.gtms.org
[root@node82 nginx]# curl bbs.gtms.org
bbs.gtms.org
[root@node82 nginx]# curl blog.gtms.org
blog.gtms.org
配置nginx狀態頁面(--with-http_stub_status_module)mysql
#vi /usr/local/nginx/conf/nginx.conf 在http標籤段加入如下內容 include status/www.conf; 在extra目錄先創建站點配置文件 status.conf #status server { listen 80; server_name status.gtms.org; location / { stub_status on; access_log off; } } #/usr/local/nginx/sbin/nginx -t 檢查ok後# /usr/local/nginx/sbin/nginx -s reload 從另外一臺主機配置hosts文件進行測試 [root@node82 nginx]# curl status.gtms.org #對後端發起的活動鏈接數,即正在處理的活動鏈接數 Active connections: 1 server accepts handled requests 7 7 11 Reading: 0 Writing: 1 Waiting: 0
nginx狀態參數
server nginx啓動到如今共處理了 7個鏈接
accepts nginx啓動到如今共成功建立7次握手,和server相同,說明沒丟失請求
handled requests 表示共處理了11次請求
Reading: Nginx 讀取到客戶端的Header信息數.
Writing: Nginx 返回給客戶端的Header信息數.
Waiting: 開啓keep-alive的狀況下,這個值等於 active – (reading + writing),意思就是Nginx已經處理完成,正在等候下一次請求指令的駐留鏈接.
因此,在訪問效率高,請求很快被處理完畢的狀況下,Waiting數比較可能是正常的.若是reading +writing數較多,則說明併發訪問量很是大,正在處理過程當中.
NGINX日誌linux
Nginx錯誤日誌
ngx_core_module模塊負責http://nginx.org/en/docs/ngx_core_module.html#error_log Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location error_log 級別分爲 debug, info, notice, warn, error, crit,alert,emerg(不要配置低等級,帶來很大磁盤IO,若是日誌太多,能夠清空再看 Nginx訪問日誌
ngx_http_log_module模塊負責http://nginx.org/en/docs/http/ngx_http_log_module.html Syntax:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off; 表示不記錄訪問日誌
Default:
access_log logs/access.log combined;
Context: (通常配置在vhost中)
http, server, location, if in location, limit_except
Example:
access_log logs/access_www.log main gzip buffer=32k flush=5s;
For gzip compression to work, nginx must be built with the zlib library.
也能夠直接發到遠程服務器
access_log syslog:server=address[,parameter=value] [format [if=condition]];
log_format 用來定義記錄日誌的格式(能夠定義多種格式,取不一樣名字)
access_log 用來指定日誌文件的路徑及使用的何種日誌格式記錄
nginx默認註釋掉的
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' (http_referer從哪過來的) # '"$http_user_agent" "$http_x_forwarded_for"';(反向代理記錄客戶端ip) #access_log logs/access.log main;
1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的真實ip地址; 2.$remote_user:用來記錄客戶端用戶名稱; 3.$time_local : 用來記錄訪問時間與時區; 4.$request : 用來記錄請求的url與http協議; 5.$status : 用來記錄請求狀態;成功是200, 6.$body_bytes_sent :記錄發送給客戶端文件主體內容大小; 7.$http_referer : 用來記錄從哪一個頁面連接訪問過來的; 8.$http_user_agent :記錄客戶端瀏覽器的相關信息;
日誌實例:192.168.0.82 - - [15/Dec/2016:02:04:24 +0800] "GET / HTTP/1.1" 200 18 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"
Nginx訪問日誌輪詢切割(沒有本身的切割工具
簡單的日誌輪詢腳本 vi cut_nginx_log.sh #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/usr/local/nginx" Nginxlogdir="$Basedir/logs" Logname="access_www" [ -d $Nginxlogdir] && cd $Nginxlogdir || exit 1 [ -f ${Logname}.log ] || exit 1 /bin/mv ${Logname}.log ${Dateformat}_${Logname}.log $Basedir/sbin/nginx -s reload 寫入crontab 00 00 * * * /bin/sh /home/script/cut_nginx_log.sh >/dev/null 2>&1 日誌分析相關工具: syslog,rsyslog,Awstats,flume,logstash scrash scribe kafka,storm。ELK=Elasticsearch+Logstash+Kibana
Nginx Rewrite(需PCRE支持)nginx
1、指令語法(perl正則) 指令語法rewrite regex replacement [flag] 默認值 none 應用位置 server,location,if 實踐: 1、增長rewrite規則 root@node83 extra]# cat /usr/local/nginx/conf/extra/www.conf #www.conf server { listen 80; server_name black.org; rewrite ^/(.*) http://www.gtms.org/$1 permanent; } server { listen 80; server_name www.gtms.org; location / { root html/www; index index.html index.htm; } } 2、在www目錄下建立此文件 [root@node83 www]# cat gtms.html rewrite 3、從新加載 root@node83 www]# /usr/local/nginx/sbin/nginx -s reload 4、配置好hosts文件,在瀏覽器輸入black.org/gtms.html ==>網址跳轉至http://www.gtms.org/gtms.html ==>顯示gtms.html的內容 flag標記: 1.last 至關於apache裏面的[L]標記,表示rewrite,繼續向下匹配新的location URI規則 2.break 本條規則匹配完成後,終止匹配,再也不匹配後面的規則。 3.redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址。 4.permanent 返回301永久重定向, 瀏覽器地址會顯示跳轉後的URL地址。 Nginx Rewrite的應用場景,在企業裏應用很是普遍(通常開發搞給運維) 1、能夠調整用戶瀏覽的url,看起來更規範 2、便於搜索引擎及用戶體驗,動態url轉成僞靜 3、舊域名訪問跳轉到新域名 ,301跳轉 4、根據特殊變量、目錄、客戶端的信息(安卓?蘋果?)進行url跳轉
NGINX之動態服務web
CGI & FastCGI正則表達式
CGI
Common Gateway Interface通用網關接口,用於HTTP服務與其餘服務通訊交流的一種工具,必須運行在網絡服務器上。
性能差,每次http遇到動態程序都須要從新啓動解釋器,以後結果返回http,高併發不可用,安全性也差,所以誕生了FastCGI
FastCGI
是一個可伸縮的,高速的在http服務器和動態腳本語言間通訊的接口(FastCGI在linux下是socket,這個socket能夠是文件socket,也能夠是ipscoket),主要優勢是把動態語言和http服務器分離。 特色: 1、是http服務器和動態腳本語言間通訊的接口或者工具 2、優勢是把動態解析和http服務器分離開來,使Ninx專注處理靜態請求和向後轉發動態請求 3、Nginx、Apache、lighted都支持 4、接口方式採用C/S結構,分爲客戶端(http服務器)和服務器端(動態語言解析服務器) 5、php動態語言服務端能夠啓動多個FastCGI守護進程(例如php-fpm) 6、http服務器經過FastCGI客戶端(例如Nginx fastcgi_pass)和動態語言FastCGI服務端通訊(例如 php-fpm)
Nginx FastCGI運行原理sql
Nginx不支持對外部程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。
FastCGI接口在Linux下是socket(這個socket能夠是文件socket,也能夠是ip socket)。
爲了調用CGI程序,還須要一個FastCGI的wrapper(wrapper能夠理解爲用於啓動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。
當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;
接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。這就是Nginx+FastCGI的整個運做過程,如圖
php 5.3.27安裝(通常由開發選擇版本)
php5.3及以上 編譯參數--enable-fpm
php5.2 編譯參數--enable-fastcgi --enable-fpm --enable-force-cgi
php5.2 參考http://blog.zyan.cc/nginx_php_v6
1、安裝lib庫 yum install zlib-devel libxml2-devel libjpeg-turbo-devel libiconv-devel -y yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel -y =======================以下包更名了 libjpeg-devel====>libjpeg-turbo-devel-1.2.1-3.el6_5.x86_64 curl-devel ====>libcurl-devel-7.19.7-40.el6_6.4.x86_64 =======================檢查安裝狀況 #rpm -qa freetype-devel libjpeg-turbo-devel libpng-devel gd-devel libcurl-devel libxslt-devel libiconv-devel:沒有被yum安裝,須要須要手動安裝 (GNU的libiconv是字符編碼轉換庫。)
mkdir -p /home/tools
cd /home/tools
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -zxf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make
make install
cd ../ 安裝libmcrypt-devel mhash mhash-devel mcrypt #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo (官方libmcrypt-devel的yum源沒有) #yum install libmcrypt-devel mhash mhash-devel mcrypt -y libmcrypt庫非必需安裝,可是可能會用 編譯安裝php php-5.3.29(附5.6編譯參數) tar xf php-5.3.29.tar.gz cd php-5.3.29 ./configure \ --prefix=/usr/local/php5.3.29 \ --with-mysql=/usr/local/mysql \ --with-mysql=mysqlnd這樣本地就不須要本地mysql了 --with-iconv-dir=/usr/local/libiconv \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --enable-xml \ --disable-rpath \ --enable-safe-mode \ --enable-bcmath \ --enable-shmop \ --enable-sysvsem \ --enable-inline-optimization \ --with-curl \ --with-curlwrappers \ --enable-mbregex \ --enable-fpm \ --enable-mbstring \ --with-mcrypt \ --with-gd \ --enable-gd-native-ttf \ --with-openssl \ --with-mhash \ --enable-pcntl \ --enable-sockets \ --with-xmlrpc \ --enable-zip \ --enable-soap \ --enable-short-tags \ --enable-zend-multibyte \ --enable-static \ --with-xsl \ --with-fpm-user=nginx \ --with-fpm-group=nginx \ --enable-ftp before make:(若是報錯,在make以前作) find / -name libmysqlclient.so.18 ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/ touch ext/phar/phar.phar ========================== 或
echo "/usr/local/mysql/lib">>/etc/ld.so.conf ldconfig ========================== #make #make install
查看PHP編譯參數
# /usr/local/php/bin/php -i |grep configure Configure Command => './configure' '--prefix=/usr/local/php5.3.29' '--with-mysql=mysqlnd' '--with-iconv-dir=/usr/local/libiconv'
'--with-freetype-dir' '--with-jpeg-dir' '--with-png-dir' '--with-zlib' '--with-libxml-dir=/usr' '--enable-xml' '--disable-rpath'
'--enable-safe-mode' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem' '--enable-inline-optimization' '--with-curl'
'--with-curlwrappers' '--enable-mbregex' '--enable-fpm' '--enable-mbstring' '--with-mcrypt' '--with-gd' '--enable-gd-native-ttf'
'--with-openssl' '--with-mhash' '--enable-pcntl' '--enable-sockets' '--with-xmlrpc' '--enable-zip' '--enable-soap' '--enable-short-tags'
'--enable-zend-multibyte' '--enable-static' '--with-xsl' '--with-fpm-user=nginx' '--with-fpm-group=nginx' '--enable-ftp'
#ln -s /usr/local/php5.3.29/ /usr/local/php #cp /home/tools/php5.3.27/php.ini-production /usr/local/php/lib/php.ini
#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf #/usr/local/php/sbin/php-fpm
#lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 127111 root 7u IPv4 113033 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 127112 nginx 0u IPv4 113033 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 127113 nginx 0u IPv4 113033 0t0 TCP localhost:cslistener (LISTEN) #grep -Ev "^;|^$" /usr/local/php/etc/php-fpm.conf | grep -v "^$" [global] [www] user = nginx group = nginx listen = 127.0.0.1:9000 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 調優參數php-fpm(能夠做爲生產標準) [global] pid = /app/logs/php-fpm.pid 默認註釋(可不改) error_log = /app/logs/php-fpm.log 默認註釋(可不改) log_level = error #notice改成error rlimit_files = 32768 #主進程文件描述符 events.mechanism = epoll #使用epoll模型 [www] user = nginx group = nginx listen = 127.0.0.1:9000 listen.owner = nginx listen.group = nginx pm = dynamic pm.max_children = 1024 #能夠建立的子進程的數量 pm.start_servers = 16 #初始的子進程個數 pm.min_spare_servers = 5 #空閒時最少子進程數 pm.max_spare_servers = 20 #最大的剩餘空間
pm.process_idle_timeout = 15s; #子進程空閒超時退出時間 pm.max_requests = 2048 #每一個子進程的最大請求 slowlog = /app/logs/$pool.log.slow request_slowlog_timeout = 10 php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f 87014247@qq.com
fastcgi設置檢測
在html/www下創建phpinfo.php <?php phpinfo(); ?>
在html/www下創建mysql.php <?php
$link_id=mysql_connect('192.168.0.80','root','rootabcd') or mysql_error();
if($link_id){
echo "mysql successful by gtms !";
}else{
echo mysql_error();
}
?>
fastcgi設置 #cat /usr/local/nginx/conf/extra/www.conf server { listen 80; server_name www.gtms.org; root html/www; location / { index index.html index.htm; } location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
測試ok
網站安全設置 # chown -R root.root blog/ upload server(上傳目錄權限放給nginx) # find ./blog/ -type f|xargs chmod 644 # find ./blog/ -type d|xargs chmod 755
PHP5.6.22 安裝
yum install zlib-devel libxml2-devel libjpeg-turbo-devel libiconv-devel -y yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel -y mkdir -p /home/tools cd /home/tools wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz tar zxf libiconv-1.14.tar.gz cd libiconv-1.14 ./configure --prefix=/usr/local/libiconv make make install cd ../ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install libmcrypt-devel mhash mhash-devel mcrypt -y PHP5.6.22: yum install openssl-devel -y tar xf php-5.6.22.tar.gz cd php-5.6.22 ./configure \ --prefix=/usr/local/php5.6.22 \ --with-mysql=mysqlnd \ --with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \ --enable-opcache \ --with-iconv-dir=/usr/local/libiconv \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --enable-xml \ --disable-rpath \ --enable-bcmath \ --enable-shmop \ --enable-sysvsem \ --enable-inline-optimization \ --with-curl \ --enable-mbregex \ --enable-fpm \ --enable-mbstring \ --with-mcrypt \ --with-gd \ --enable-gd-native-ttf \ --with-openssl \ --with-mhash \ --enable-pcntl \ --enable-sockets \ --with-xmlrpc \ --enable-soap \ --enable-short-tags \ --enable-static \ --with-xsl \ --with-fpm-user=nginx \ --with-fpm-group=nginx \ --enable-ftp make make install ln -s /usr/local/php5.6.22/ /usr/local/php server { listen 80; server_name blog.gtms.org; root html/blog; location / { index index.html index.htm; } location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }