nginx初步

一、知識整理

1、查看進程使用的cpu;ni查看nice

[root@localhost html]# ps axo pid,comm,psr,ni
 43769 nginx             0  21  -2
 43770 nginx             3  21  -2
 43771 nginx             2  21  -2
 43775 ps                3  19   0

2、C10K問題:并發達到10k

httpdprefork模型默認是256個,其采用select上限是1024個;

3OpenResty

OpenResty是一個基于 Nginx Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。

4、 根據等待模式不同,IO動作可分為五種模式:

blocking I/O:阻塞式I/O:兩步都阻塞

nonblocking I/O:非阻塞式I/O:忙等,阻塞在第二步

I/O multiplexing (select and poll)I/O復用:阻塞在復用IO

signal driven I/O (SIGIO):信號驅動式I/O:回調,阻塞第二階段,解放第一階段,可以接多個請求

asynchronous I/O (AIO_):異步I/O:解放兩個階段

5、nginx的源碼包編譯安裝,首先安裝需要的環境和包:

[root@localhost nginx-1.10.0]# yum install openssl-devel  zlib-devel  pcre-devel  proxy-devel -y
[root@localhost nginx-1.10.0]# useradd -r nginx
[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/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.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

6、nginx主進程主要完成如下工作:

    讀取并驗證配置信息;

    創建、綁定及關閉套接字;

    啟動、終止及維護worker進程的個數;

    無須終止服務而重新配置工作特性;

    控制非中斷式程序升級,啟用新的二進制程序并在需要時回滾至老版本;

    重新打開日志文件;

    編譯嵌入式perl腳本;

    worker進程主要完成的任務包括:

    接收、傳入并處理來自客戶端的連接;

    提供反向代理及過濾功能;

    nginx任何能完成的其它任務;

    cache loader進程主要完成的任務包括:

    檢查緩存存儲匯總的緩存對象;

    使用緩存元數據建立內存數據庫;

    cache manager進程的主要任務:

    緩存的失效及過期檢驗;

 

二、命令詳解

1、正常運行必備的配置:

Syntaxuser user [group]

Defaultuser nobody nobody;

Contextmain

定義運行work進程時的用戶和組,默認是nobody;

pid /PATH/TO/PID_FILE

指定存儲nginx主進程進程號碼的文件路徑。

include file | mask;

指明包含進來的其他配置文件片段;

load_module_file

裝載一個動態模塊(1.9.11版本之后才有)

2、性能優化相關的配置:

worker_process number | auto

worker進程的數量;通常應該為當前主機的cpu物理核心數或減一,auto為與核心數相同

worker_cpu_affinity cpumask …;

worker_cpu_affinity auto [cpumask];(cpu掩碼) auto是指隨機使用核心,但不高效;

如:00000001 00000010 是指第0號和第1

worker_priority number;

指定worker進程的nice-20~19,此處是-20~20)值,模式都是0,。設定worker進程優先級,優先被調度到cpu。

worker_rlimit_nofile  (number of file)

worker進程能夠打開的文件(每個連接至少一個套接字文件)數量上限。

3、事件驅動相關的配置;

worker_connections number;

每個worker進程所能夠打開的最大并發連接數量;

use METHOD;

指明并發連接請求的處理方法;默認是epoll。

accept_mutex on|off

處理新的連接請求的方法;on時由個worker輪流處理新請求,off以為這每個新請求的到達都會通知所有的worker進程;

mutex互斥鎖,默認是off,建議設置為on。

4、定義虛擬主機的配置:

listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

 backlog=后援隊列長度 rcvbuf:接受緩沖大??; sndbuf:發送緩沖大小

server_name name…;

指明虛擬主機的主機名稱;后可跟多個由空白字符分隔的字符串;

支持*通配任意長度的任意字符;server_name *.magedu.com

支持~起始的字符做正則表達模塊匹配;server_name ~^www\d+\.amgedu\.com$

其中\d 表示0-9

匹配順序機制:

首先是字符串精確匹配;

左側*通配符通配;

右側*通配符;

正則表達式匹配順序最靠后。

tcp_nodelay on|off

對于GUI程序,如網絡游戲程序(服務器需要實時跟蹤客戶端鼠標的移動),關閉TCP_NODELAY通常是正確的。

sendfile on|off:

sendfile系統調用是一種文件傳輸的系統調用kernel系統調用關系不大。nginx支持了sendfile之后,避免了內核層與用戶層的上下文切換工作,大大減少了系統性能的開銷;sendfile是個比 read write 更高性能的系統接口, 不過需要注意的是,sendfile 是將 in_fd 的內容發送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。 所以當 Nginx 是一個靜態文件服務器的時候,開啟 SENDFILE 配置項能大大提高 Nginx 的性能。 但是當 Nginx 是作為一個反向代理來使用的時候,SENDFILE 則沒什么用了,因為 Nginx 是反向代理的時候。 in_fd 就不是文件句柄而是 socket,此時就不符合 sendfile 函數的參數要求了。

root和alias:

location /PATH/ 在之中定義root后,其路徑是root定義的path/下的/PATH;定義了alias之后,其路徑與別名是相對應的;(一個對應左側,一個對應右側) 在一個server中,location可以存在多個,用戶實現從uri到文件系統的路徑映射;nginx會根據用戶請求的RUI來檢查定義的所有location并找出一個最佳匹配,而后應用其配置。

5、客戶端相關定義:

keepalive_timeout timeout [header_timeout];

設置保持連接的超時時長,0為禁止,默認75s

keepalive_requests number;

默認為100;在一次長連接所允許的數量;

keepalive_disable none | browser….;

設定對哪種瀏覽器關閉長連接;

send_timeout time

向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長;

client_body_buffer_size

默認是 16K,超出部分將被暫存到磁盤上的由下一條指定的path的指定的位置;

client_body_temp_path path [level1 [level2 [level3]]];

設定用戶存儲客戶端請求報文的body部分臨時存儲路徑及子目錄結構和數量;

level是16進制的數字:

1 2 表示16個一級子目錄下有256兩個子目錄,如下:

client_body_buffer_size 20K;

client_body_temp_path /tmp/nginx 1 2 2;

limit_rate rate

限制響應給客戶端的傳輸速率;單位是bytes/second,0表示無限制;

limit_except method…

限制指定主機使用此類請求方法;allow,deny;

6、文件操作優化的配置:

alo on|off

默認是off,建議開啟;

directio size|off;

在服務器上啟用,直接io機制,此處指文件大小大于指定大小時使用,將數據直接存入磁盤;默認是4M

open_file_cache max=N [inactive=time];(非活動緩存時間,此處指定的時長內未被命中的或命中次數少于min_users指令所指定的次數的緩存項即為非活動項;過時清除)

N為緩存上線,達到上限后會使用LRU算法實現緩存管理;

打開文件緩存功能;存儲文件描述符、大小、最近一次修改時間的元數據,緩存目錄的結構,沒有權限訪問的文件的信息也會緩存下來。

open_file_cache_valid time

驗證緩存有效期的檢查時間;默認60s

open_file_cache_min_users number;

inactive參數指定的時長內,至少應被命中多少次方可被歸類為活動項;

open_file_cache_errors on|off

是否緩存查找時發生錯誤的文件的相關信息;

7、基于basic機制的用戶的控制:

auth_basic STRING|off;

auth_basic_user_file file

8、location相關配置:

location [ = | ~ | ~* | ^~ ] uri {…}

location URI {};

對當前路徑及子路徑下的所有對象都生效;

location = URI;完全精確匹配,如若寫為location /

則只會匹配www.magedu.com/

只對當前路徑生效,不包括子路徑;

location ~ URI {};

location ~* URI {}

模式匹配,此處的URI可使用正則表達式,~區分字符大小寫;~*不區分大小寫;

location ^~ URI {};

對左半部分做匹配檢查,不區分大小寫;

優先級:=最高,^~其次,~|~*相同,任何符號都沒有的最末;不帶符號代表以此起始的所有URL(文件,非路徑);同樣沒有符號,以路徑最長的優先;

9、ngx_http_rewrite_module模塊:

將用戶請求的URI基于regex所描述的模式進行檢查,而后完成替換;

rewrite REGEX REPLACEMENT [FLAG]

將用戶請求的URI基于regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新URI;

注意:在同一級別配置塊中存在多個rewrite規則,那么會自上而下逐個檢查;并逐個替換,有可能形成死循環;[flag]所表示的標志位用于控制此循環機制;如果replacement是以http://或者https://開頭,則替換結果會直接以重定向返回給客戶端;

[flag]

last:默認;重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后對新的URI啟動新一輪重寫檢查;

break:本次重寫完成后,跳出循環,可用于防止死循環。以上兩次都是nginx內部自動跳轉;客戶端只需要請求一次;

redirect:返回臨時重定向的30x標識碼,而使瀏覽器重新發送請求;不能寫絕對路徑即以httphttps開頭。此flag使用戶的客戶端瀏覽器重新發出請求,而不是在nginx內部自動跳轉;

permanent:永久重定向;

三、課后練習

練習:實現lnmp,提供多個虛擬主機;

(1) http, 提供wordpress;

(2) https, 提供pma;

步驟一:首先配置LNMP環境:

安裝所需要的開發環境和mysql-serverphp,php-fpm,php-mysql

安裝編譯nginx所需要的環境并編譯安裝nginx

[root@localhost nginx-1.10.0]# yum install openssl-devel  zlib-devel  pcre-devel  proxy-devel -y
[root@localhost nginx-1.10.0]# useradd -r nginx
[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/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.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

配置nginx的環境變量等;

步驟二:更改php-fpm的配置文件:

[root@localhost ~]# vim /etc/php-fpm.d/www.conf

打開pingsessionpm_status功能,并將啟動的屬組屬主更改為nginx

ping.path = /ping

php_value[session.save_path] = /var/lib/php/session

pm.status_path = /pm_status

user = nginx

group = nginx

配置mysql,更改root用戶密碼;此處因為安裝在同一主機上,監聽的IP都使用的127.0.0.1。

開啟mysql服務和php-fpm服務。

步驟三:配置虛擬主機1

server {

    listen 10.1.49.11:80;

    server_name www1.magedu.com;

    root /vhost/www1/;

    index index.php index.html;

    location ~* \.php$ {

        root /vhost/www1;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /vhost/www1/$fastcgi_script_name;

        fastcgi_pass 127.0.0.1:9000;

        include fastcgi_params;

    }

    location ~* ^/(pm_status|ping)$ {

        include     fastcgi_params;

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_param SCRIPT_FILENAME /vhost/www1/$fastcgi_script_name

    }

}

使用測試頁測試:

[root@localhost ~]# cat /vhost/www1/index.php.bak 
<h1>Test Html</h1>
<?php
$conn=mysql_connect('localhost','root','magedu');
if ($conn)
echo "success";
else
echo "failure";
?>
<?php
phpinfo();
?>

blob.png

步驟四:安裝WordPress

使用mysql授權用戶:

MariaDB [(none)]> CREATE DATABASE wordpress ;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> USE wordpress
Database changed
MariaDB [wordpress]> GRANT ALL ON wordpress.* TO 'word'@'127.0.0.1' IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.01 sec)
MariaDB [wordpress]> GRANT ALL ON wordpress.* TO 'word'@'localhost' IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.00 sec)
MariaDB [wordpress]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

WordPress其父目錄更改為可寫:

[root@localhost vhost]# chown root:nginx www1 
[root@localhost vhost]# chmod g+w www1
[root@localhost vhost]# ll
總用量 4
drwxrwxr-x. 5 root nginx 4096 10月 15 06:50 www1
drwxr-xr-x. 2 root root    22 10月 15 06:10 www2

啟動安裝步驟:

blob.png

blob.png

blob.png

步驟五:配置虛擬主機2

server {

    root /vhost/www2/;

    server_name www2.magedu.com;

    listen 443 ssl;

    index index.html index.htm index.php;

    ssl on;

    ssl_certificate /etc/nginx/ssl/nginx.crt;

    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    ssl_session_cache shared:sslcache:20m;

    location ~* \.php$ {

        root /vhost/www2/;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /vhost/www2/$fastcgi_script_name;

        fastcgi_pass 127.0.0.1:9000;

        include fastcgi_params;

    }

}

步驟六:生成證書:

[root@localhost ssl]# (umask 077;openssl genrsa -out nginx.key 2048)
[root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr -days 365
[root@localhost ssl]# openssl ca -in nginx.csr  -out nginx.crt -days 365

訪問驗證:

blob.png

步驟七:安裝pma

[root@localhost phpMyAdmin-4.0.5-all-languages]# cp ./* -rf  /vhost/www2/
[root@localhost www2]# chown root:nginx ./* -R
[root@localhost www2]# cp config.sample.inc.php config.inc.php 
[root@localhost www2]# vim config.inc.php

添加隨機數,安裝:

報錯:安裝mbstringphp-gd包:

blob.png

[root@localhost Packages]# yum install php-mbstring  php-gd

重載服務,刷新訪問:

[root@localhost Packages]# systemctl reload php-fpm

blob.png

blob.png

添加mcrypt擴展,重載訪問:

[root@localhost Packages]# yum install php-mcrypt

blob.png

原創文章,作者:SilencePavilion,如若轉載,請注明出處:http://www.www58058.com/56381

(0)
SilencePavilionSilencePavilion
上一篇 2016-10-31
下一篇 2016-10-31

相關推薦

  • 任務計劃1

    at.allow :優先級高,有此文件,deny無效,只有此文件中的用戶可使用at at.deny:優先級低,此文件中的用戶拒絕,不在此文件允許 如果都沒有,全都拒絕普通用戶     [root@localhost ~]# rpm -q  at at-3.1.13-22.el7.x86_64 [root@localhost ~]…

    Linux干貨 2017-05-15
  • linux的tty

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/140012 最近做了一個小測試,得到了以下結論 測試linux發行版本:rhel AS4.0 環境:VMware 5.0 目的:修改 vi /etc/initt…

    Linux干貨 2015-03-26
  • 搭建discuz服務器

      Discuz是目前比較流行的社區論壇系統,其具有安裝簡便、功能強大的特點,下面以LAMP為基礎平臺來搭建discuz服務器。   一、安裝apache服務   二、安裝php   三、安裝mysql   四、安裝php-mysql   五、啟動mysql服務   六、創建數據庫 &nb…

    Linux干貨 2016-03-18
  • 學習Linux的第一周 之screen

         1.來到馬哥的感想:      已經接觸Linux已經一周,在緊張的而又條理的學習當中,我學到了很多東西單說量我就很佩服自己,在大學的兩年當中已經快把自己學習新知識的渴望忘記了!來到馬哥這短短一周我感覺我真的長大了很多,我把手機王者榮耀卸載了。只想對自己說加油堅持下去?!?/p>

    Linux干貨 2017-07-16
  • 第六周學習總結

    寫在前面 在互聯網+的時代,網絡顯得越發重要,如果現在你一頓不吃飯可能還沒事但是一個小時沒網絡,估計你都要瘋了。那么網絡到底是個啥呢?看不見又摸不著。拿著一臺電腦怎么和網絡建立連接呢?那么下面要講解的內容或許可以給你解決個大概。 閑聊網絡 如果讓你修一棟房子你會一層一層的往上修,并且規劃好一層用來開商鋪,二層用來開超市,上面一層用來干嘛等等,其實網絡也是一樣…

    2018-01-08
  • 2016/08/07:文本處理工具及正則表達式

      在本次課程中,本以為和前面的內容難度差不多,內心毫無提防,但在做隨堂練習的時候,被慘虐,不由得使我想起了高三時候拿到一張數學單元練習題,一道題也不會做的那種感覺,無助,彷徨,不甘。到了晚上總結了一下,還是有緣由可尋的。直接原因就是前面知識記得不牢固,也并未完全理解是和意思,尤其是tr命令,適用于何處,沒按照5W1H方法來進行總結學習,導致應用的…

    Linux干貨 2016-08-07
欧美性久久久久