Nginx服務與LNMP部署以及管理優化

Nginx服務與LNMP部署

Nginx簡介:跟Apache一樣,是一款web服務器軟件,也在普遍使用

Nginx的特點:併發量高,內存佔用小、處理速度快、但是CPU佔用大、安全性較低、模塊較少

Nginx服務配置

啓動命令:nginx       停止命令:killall -s QUIT nginx        重啓命令:killall -s QUIT nginx 》》nginx

重新加載:killall -s HUP nginx           查看服務開啓狀態:ps -ef | grep "nginx" 或者netstat -anpt | grep "nginx"

配置文件詳解

nginx配置文件主要分爲六個區域:

1.main:全局設置        2.events:nginx工作模式     3.http:http設置

4.sever:主機設置      5.location:URL匹配       6.upstream:負載均衡服務器設置
配置文件結構分佈:


main

events{。。。。。。}

http{

。。。。。。

server{

。。。。。。

location 1{。。。。。。}

location 2{。。。。。。}

}

}


全局配置:

user  nobody;     //程序用戶名

worker_processes  1;      //設置nginx子進程數量,即提供服務的進程數量,該數值建議和服務cpu核數保持一致

error_log  logs/error.log;   //設置錯誤日誌的路徑

error_log  logs/error.log  notice;   //設置錯誤日誌的路徑

error_log  logs/error.log  info;   //設置錯誤日誌的路徑

pid  logs/nginx.pid;    //設置nginx進程pid文件所在路徑

worker_rlimit_nofile 10000;    //設置nginx最多打開文件數限制

events配置:

worker_connections 1024;     //定義每個work_process同時開啓的最大連接數

accept_mutex on;          //防止多個進程爭搶資源,默認就是on

multi_accept on;         //nginx worker processer可以做到同時接收多個新到達的網絡連接,默認爲off

use epoll;           //設置模式,模式有如下:

select:只能在Windows下使用,這個事件模型不建議在高負載的系統使用

poll:Nginx默認首選,但不是在所有系統下都可用

kqueue:這種方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系統中是最高效的

epoll:這種方式是在Linux 2.6+內核中最高效的方式

rtsig:實時信號,可用在Linux 2.2.19的內核中,但不適用在高流量的系統中

eventport:Solaris 10最高效的方式

http配置:

MIME-Type

include mime.types;            //設置nginx能識別的網絡資源媒體類型(如,文本、html、js、css、流媒體等)

default_type application/octet-stream;      //設置默認的type,如果不定義改行,默認爲text/plain.

log_format

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

其中main爲日誌格式的名字,後面的爲nginx的內部變量組成的一串字符串。

access_log logs/access.log main;    //設置日誌的路徑以及採用的日誌格式,該參數可以在server配置塊中定義

sendfile on;              //是否調用sendfile函數傳輸文件,默認爲off

sendfile_max_chunk 128k;         //限制Nginx worker process每次調用sendfile()函數傳輸數據的最大值,默認值爲0無限制

tcp_nopush on;         //當調用tcp_cork方法進行數據傳輸,默認值爲on

keepalive_timeout 65 60;    //第一個值設置nginx服務器與客戶端會話結束後仍舊保持連接的最長時間,單位是秒,默認爲75s

第二個值針對客戶端的瀏覽器來設置的,可以通過curl -I看到header信息中有一項Keep-Alive: timeout=60,如果

補充:不設置就沒有這一項,第二個數值設置後,瀏覽器就會根據這個數值決定何時主動關閉連接,Nginx服務器就不操心了。但

有的瀏覽器並不認可該參數

send_timeout           //發送響應的超時時間

client_max_body_size 10m;             //限制Content-Length所示值的大小的

gzip on;    //是否開啓gzip壓縮

gzip_min_length 1k;       //設置允許壓縮的頁面最小字節數,默認值20

gzip_buffers 4 16k;         //設置系統獲取幾個單位的buffer用於存儲gzip的壓縮結果數據流

gzip_http_version 1.1;         //用於識別 http 協議的版本

gzip_comp_level 6;       //gzip壓縮比

gzip_types mime-type ... ;          //匹配mime類型進行壓縮

gzip_proxied any;                      //Nginx作爲反向代理的時候啓用,決定開啓或者關閉後端服務器返回的結果是否壓縮

以下爲可用的值:

off - 關閉所有的代理結果數據的壓縮

expired - 啓用壓縮,如果header頭中包含 "Expires" 頭信息

no-cache - 啓用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息

no-store - 啓用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息

private - 啓用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息

no_last_modified - 啓用壓縮,如果header頭中不包含 "Last-Modified" 頭信息

no_etag - 啓用壓縮 ,如果header頭中不包含 "ETag" 頭信息

auth - 啓用壓縮 , 如果header頭中包含 "Authorization" 頭信息

any - 無條件啓用壓縮

gzip_vary on;     //可以讓前端的緩存服務器緩存經過gzip壓縮的頁面

爲了方便我們自己寫個腳本,然後可以用service命令來管理nginx

腳本如下:

#!/bin/bash
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
PROG_FPM="/usr/local/sbin/php-fpm"
PID_FPM="/usr/local/php5/var/run/php-fpm.pid"
isstatus=`ps -ef | awk '{print $1}' | grep "nginx" | wc -l`
start()
{
    if [ $isstatus -ne 0 ]
    then
       echo "nginx already started"
    else
       $PROG
       $PROG_FPM
       echo "nginx starting......"
    fi
}
stop()
{   
    if [ $isstatus -ne 0 ]
    then
       kill -s QUIT $(cat $PIDF)
       kill -s QUIT $(cat $PID_FPM)
       echo "nginx shutting down......"
    else
       echo "nginx has ceased"
    fi
}
restart()
{   
    if [ $isstatus -ne 0 ]
    then
       kill -s QUIT $(cat $PIDF)
       kill -s QUIT $(cat $PID_FPM)
       $PROG
       $PROG_FPM
       echo "nginx restart......"
    else
       echo "nginx not started"
    fi
}
reload()
{
       kill -s HUP $(cat $PIDF)
       kill -s HUP $(cat $PID_FPM)
       echo "nginx is reloading......"
}
status()
{
    if [ $isstatus -eq 0 ]
       then
         echo "nginx:nginx not running"
       else
         echo "nginx:mginx is running"
   fi 
}
case "$1" in
start)
     start
     ;;
stop)
     stop
     ;;
restart)
     restart
     ;;
reload)
     reload
     ;;
status)
     status
     ;; 
*)
    echo "Usage:$0 {start|stop|restart|reload|status}" 
esac

注意:記得把腳本名字改成nginx,然後再放到/etc/init.d/目錄下,之後就可以使用service命令管理了

啓動服務:service nginx start     停止服務:service nginx stop     重啓服務:service nginx restart

查看服務:service nginx status    重新加載服務:service nginx reload

nginx主配置文件位置:/usr/local/nginx/conf/nginx.conf(源碼包安裝)

一、源碼編譯安裝Nginx

1.安裝支持軟件,Nginx的配置需要pcre、zlib等軟件

yum -y install pcre-devel zlib-devel

2.nginx默認以nobody運行,建議建立專用用戶

useradd -M -s /sbin/nologin nginx

3.下載Nginx軟件包解壓安裝

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

make && make install

編譯安裝nginx選項:

--prefix=目錄:設置Nginx的安裝路徑                          默認路徑:/usr/local/nginx

--sbin-path=目錄:設置Nginx的可執行文件路徑         默認路徑:prefix/sbin/nginx

--conf-path=目錄:設置Nginx配置文件路徑                默認路徑:prefix/conf/nginx.conf

--pid-path=目錄:設置Nginx pid文件路徑                   默認路徑:prefix/logs/nginx.pid

--error-log-path=目錄:設置錯誤日誌存放路徑           默認路徑:prefix/logs/error.log

--http-log-path=目錄:設置訪問日誌存放路徑            默認路徑:prefix/logs/access.log

--user=用戶名:設置運行Nginx的用戶                       默認用戶:nobody

--group=用戶組名:設置運行Nginx的用戶組              默認用戶組:nobody

4.路徑的優化

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

5.檢查優化以及配置文件

啓動Nginx:nginx

對網頁訪問測試服務是否搭建成功(下圖爲Nginx的默認網頁,能訪問爲成功)

二、MySQL數據庫安裝

1.安裝依賴包:yum -y install ncurses-devel

2.安裝cmake工具

然後gmake && gmake install

3.解壓編譯安裝mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc

然後make && make install

4.優化路徑以及優化管理

運行/etc/profile文件(沒有權限記得加權限)

5.初始化數據庫,啓動mysql服務

創建用戶組和用戶,設置爲屬主目錄

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

路徑優化

ln -s /usr/local/mysql/bin/* /usr/bin

下圖爲安裝成功

三、PHP安裝搭建

1.下載各種依賴包

yum -y install zilb zlib-devel libxml2-devel pcre pcre-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel curl-devel gd

2.解壓源碼包並且編譯安裝

解壓再到解壓目錄下編譯

./configure --prefix=/usr/local/php5 --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib

然後安裝:make && make install

複製配置文件模板使用

cp php.ini-development /usr/local/php5/php.ini

3.路徑優化

ln -s /usr/local/php5/bin/* /usr/local/bin/

ln -s /usr/local/php5/sbin/* /usr/local/sbin/

4.實現nginx與PHP對接

useradd -M -s /sbin/nologin php

使用模板/usr/local/php5/etc/php-fpm.conf.default

cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf

配置模塊配置文件:vim /usr/local/php5/etc/php-fpm.conf

pid = run/php-fpm.pid

user = php

group = php

PHP優化(可選)

pm.max_children = 50                    // 根據內存大小設置,一個進程大約 3M

pm.start_servers = 20                     //啓動時開啓的進程數

pm.min_spare_servers = 5             //最少空閒進程數

pm.max_spare_servers = 35           //最多空閒進程數

啓動fpm進程:/usr/local/sbin/php-fpm

查詢php-fpm是否啓動(下圖爲啓動):netstat -anpt | grep php-fpm

修改nginx.conf,在www.aaa.com網站中使用本地php環境:vim /usr/local/nginx/conf/nginx.conf

在server{}裏添加如下:

location ~ \.php$ {
            root           /var/www/aaa;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

記得保存重啓服務

測試

編寫php文件

<?php

phpinfo();

?>

編寫php文件測試數據庫

出現以上錯誤說明mysql_connect這個模塊將在未來棄用,請你使用mysqli或者PDO來替代

解決方法一(不建議,最好把報錯顯示出來):

display_errors=on改爲off

解決方法二

修改php文件代碼:mysql_connect改成mysqli_connect

成功如下圖:

補充:安裝ZendGuardLoader優化模塊

cp ZendGuardLoader.so  /usr/local/php5/lib/php/

修改php.ini配置文件啓用優化模塊

zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so

zend_loader.enable=1

虛擬站點搭建

直接修改主配置文件添加一個server板塊即可,配置如下圖(基於域名):

vim /usr/local/nginx/conf/nginx.conf

四、Nginx+Apache動靜分離

作用原理:Nginx靜態頁面的處理擁有更好的性能,用Nginx訪問html而用Apache訪問php

1.編譯安裝Apache之後修改配置文件端口改爲8080

Listen 8080ServerName study2.renjie.com:8080

2.安裝LAMP需要的php擴展包libmcrypt、mhash、mcrypt

3.重新編譯php

./configure --prefix=/usr/local/php5 --with-mcrypt --with-apxs2=/usr/local/httpd/bin/apxs --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib

Apache主配置文件添加識別php

AddType application/x-httpd-php .phpDirectoryIndex index.php index.html

編寫網頁測試訪問該地址8080端口和下面的php文件

        

最後修改Nginx主配置文件

添加

location ~ \.php$ {
            proxy_pass   http://www.cba.com;
  }

保存重啓服務訪問測試用Nginx下的www.bbb.com去訪問Apache下的php網頁

 

五、訪問控制

基於授權的訪問控制

下載工具安裝:yum install -y  httpd-tools

1.生成用戶密碼認證文件

htpasswd  -c /usr/local/nginx/passwd.db webadmin

然後會讓你輸入密碼並確認密碼

2.修改passwd.db的權限爲400 ,修改文件屬主爲nginx用戶

3.修改配置文件,添加認證項

在要設置的站點location下添加

auth_basic "secret";

auth_basic_user_file  /usr/local/nginx/passwd.db;

基於地址限制的訪問控制

直接在要設置的站點的location下設置

deny 192.168.0.100;

allow all;

六、Nginx管理優化

隱藏版本號

查詢版本號:curl -I http://192.168.0.122(也可以把IP地址換成解析後的網址)

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

在http裏添加server_tokens off;就可以隱藏版本(記得重啓服務生效)

補充:在編譯之前修改安裝包裏nginx-1.17.8/src/core目錄下的nginx.h文件

修改下面兩個參數再編譯安裝,可以設置版本信息顯示內容

#define NGINX_VERSION      "1.17.8"
#define NGINX_VER          "nginx/" NGINX_VERSION

 

修改用戶組

Nginx運行時主進程是root創建,子進程由指定 的用戶和組創建,Nginx默認使用的nobody

1.編譯安裝時指定用戶和組

./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_stub_status_module

2.編譯安裝完之後修改配置文件:vim /usr/local/nginx/conf/nginx.conf

user nginx nginx;

配置網頁緩存時間

修改主配置文件:vim /usr/local/nginx/conf/nginx.conf

在網頁塊下新加一個location

日誌切割

Nginx沒有類似apache的cronlog日誌分割處理能力,但是可以通過nginx的信號控制功能腳本來實現日誌的分割

#!/bin/bash
#定義各種變量
date=`date -d "-1 day" +%Y%m%d`
logpath="/usr/local/nginx/logs"
pidpath="/usr/local/nginx/logs/nginx.pid"
#移動日誌到存放目錄
[ -d $logpath ] || mkdir -p $logpath
mv /usr/local/nginx/logs/access.log ${logpath}/www..access.log.$date
#重新創建日誌目錄
kill -HUP `cat $pidpath`
#定期刪除多餘的日誌文件(刪除30天之前的)
find $logpath -mtime +30 | xargs rm -rf

nginx 1.16版本開始自帶了日誌切割功能,而1.12版本,目前有幾種辦法可以做到按天切割

設置連接超時

爲了避免一個客戶長時間佔用連接,造成資源浪費,可設置相應的連接超時參數,實現控制連接訪問時間

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

Keepalive_timeout 65 180 ;  \\默認時間65 超時時間180

進程優化

優化nginx進程數量,修改 Nginx 的配置文件的 worker_processes 參數,一般設爲 CPU 的個數或者核數, 在高併發的情況下可設置爲 CPU 個數或者核數的 2 倍,可以查看 CPU 的核數以確定參數

查看進程:cat /proc/cpuinfo | grep -c "physical"

默認情況,nginx的多個進程可能更多的跑在一個CPU上,可以分配不同的進程給 不同的 CPU 處理,充分利用硬件多核多 CPU,在一臺 4 核 CPU 服務器上,可以設置每個 進程分別由不同的 CPU 核心處理,達到 CPU 的性能最大化

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

worker_processes 4;     \\開啓進程數

worker_cpu_affinity 0001 0010 0100 1000  \\邏輯CPU

補充:1.16版本

work_processes auto;

網頁壓縮

Nginx 的 ngx_http_gzip_module 壓縮模塊提供了對文件內容壓縮的功能,默認nginx已經安裝此模塊

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

 gzip  on;                    \\開啓gzip壓縮輸出

gzip_min_length 1k;       \\用於設置允許壓縮的頁面最小字節數

gzip_buffers 4 16k;       \\表示申請 4 個單位爲 16k 的內存作爲壓縮結果流緩存,默認值 是申請與原始數據大小相同的內存空間來存儲 gzip 壓縮結果

gZip_http_version 1.0;     \\用於設置識別 http 協議版本,默認是 1.1,目前大部分瀏覽 器已經支持 gzip 解壓,但處理最慢,也比較消耗服務器 CPU 資源

Gzip_comp_level2;         \\用來指定 gzip 壓縮比,1 壓縮比最小,處理速度最快;9 壓縮 比最大,傳輸速度快,但處理速度最慢,使用默認即可

Gzip_types text/plain;          \\壓縮類型,是對哪些網頁文檔啓用壓縮功能

Gzip_vary on;        \\選項可以讓前端的緩存服務器緩存經過 gzip 壓縮的頁面

防盜鏈

Nginx 的防盜鏈原理是加入 location 項,用正則表達式過濾圖片類型文件,對於信任的 網址可以正常使用,不信任的網址返回相應的錯誤圖片

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

在需要設置的網頁段下面添加location

location ~*\.(png|jpg|gif|swf)$ {
                valid_referers none blocked *.bbb.com bbb.com;
                if ($invalid_referer) {
                        rewrite ^/http://www.aaa.com/error.jpg;
                }   
        }

FPM參數優化

Nginx的PHP解析功能實現其中一種是交給FPM處理,如果要提供nginx對PHP的處理速度,需要對FPM進行優化

修改配置文件:vim /usr/local/php5/etc/php-fpm.conf

pm = dynamic / static;         \\static(靜態)或者dynamic(動態)

pm.max_children = 5;       \\如果靜態方式開啓的php-fpm進程數,在動態方式下他限定php-fpm的最大進程數

pm.start_servers = 2;       \\動態情況下初始啓動的進程數

pm.max_spare_servers = 3;     \\動態情況下最大的空閒進程

pm.min_spare_servers = 5;     \\動態情況下最小的空閒進程

pm.max_requests = 500;      \\最大的請求數

補充:建議設置

pm=dynamic;

pm.max_children=20;

pm.start_servers=5;

pm.min_spare_servers=5;

pm.max_spare_servers=20;

這樣可以最大的節省內存並提高執行效率

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章