一、知識整理
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
httpd的prefork模型默認是256個,其采用select上限是1024個;
3、OpenResty
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、正常運行必備的配置:
Syntax:user user [group];
Default:user nobody nobody;
Context:main
定義運行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標識碼,而使瀏覽器重新發送請求;不能寫絕對路徑即以http和https開頭。此flag使用戶的客戶端瀏覽器重新發出請求,而不是在nginx內部自動跳轉;
permanent:永久重定向;
三、課后練習
練習:實現lnmp,提供多個虛擬主機;
(1) http, 提供wordpress;
(2) https, 提供pma;
步驟一:首先配置LNMP環境:
安裝所需要的開發環境和mysql-server,php,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
打開ping、session和pm_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(); ?>
步驟四:安裝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
啟動安裝步驟:
步驟五:配置虛擬主機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
訪問驗證:
步驟七:安裝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
添加隨機數,安裝:
報錯:安裝mbstring和php-gd包:
[root@localhost Packages]# yum install php-mbstring php-gd
重載服務,刷新訪問:
[root@localhost Packages]# systemctl reload php-fpm
添加mcrypt擴展,重載訪問:
[root@localhost Packages]# yum install php-mcrypt
原創文章,作者:SilencePavilion,如若轉載,請注明出處:http://www.www58058.com/56381