Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。 其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。 Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特色是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。 1、nginx能夠實現的功能 一、能夠做爲靜態資源的web服務器、能夠緩存文件的資源描述符——加速 二、支持對http、stmp、pop3等多種協議的反向代理 三、支持實現緩存和負載均衡 四、支持fcgi 五、支持uWSCGI 六、支持模塊化 七、支持過濾器,對特定文件進行壓縮傳輸 八、支持ssl 九、支持圖像大小調整 二.、nginx的特性 一、模塊 二、高性能 三、低內存消耗 四、支持熱部署 五、支持異步IO 六、支持事件驅動 七、支持內存映射 3、核心模塊 一、標準http模塊 二、拓展http模塊 三、郵件拓展模塊 四、第三方模塊 4、安裝依賴 [root@156 ~]# yum groupinstall "Development Tools" -y [root@156 ~]# yum install pcre-devel openssl openssl-devel -y 5、安裝nginx (1)建立nginx的運行用戶 [root@156 ~]# groupadd -r nginx [root@156 ~]# useradd -r -s /sbin/nologin -g nginx nginx [root@156 ~]# tar xvf nginx-1.6.2.tar.gz [root@156 ~]# cd nginx-1.6.2 [root@156 nginx-1.6.2]# ./configure --help | more [root@156 nginx-1.6.2]# ./configure \ --prefix=/usr/local/nginx \ --conf-path=/etc/nginx/nginx.conf \ --user=nginx --group=nginx \ --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 \ --with-http_ssl_module \ --with-http_stub_status_module \ --without-http_gzip_module \ --with-http_mp4_module \ --with-http_flv_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 \ [root@156 nginx-1.6.2]# make && make install (2)建立臨時文件的保存目錄 [root@156 nginx-1.6.2]# mkdir /var/tmp/nginx/{client,proxy,fcgi} -pv mkdir: created directory `/var/tmp/nginxclient' mkdir: created directory `/var/tmp/nginxproxy' mkdir: created directory `/var/tmp/nginxfcgi' (3)啓動nginx [root@156 ~]# /usr/local/nginx/sbin/nginx [root@156 ~]# ss -tnl | grep 80 LISTEN 0 128 *:80 [root@156 ~]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 8395 root 6u IPv4 20287 0t0 TCP *:http (LISTEN) nginx 8396 nginx 6u IPv4 20287 0t0 TCP *:http (LISTEN) [root@156 ~]# ps aux | grep nginx root 8395 0.0 0.1 44572 1040 ? Ss 22:05 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 8396 0.0 0.1 45000 1620 ? S 22:05 0:00 nginx: worker process root 8513 0.0 0.0 103308 848 pts/0 S+ 22:39 0:00 grep nginx 測試:在瀏覽器上輸入 服務器的IP地址便可訪問nginx界面,例如 http://192.168.70.156/ nginx配置詳解 6、和nginx正常運行相關的配置 一、worker_processes 1; 設置發起幾個nginx的worker進程 二、user userName [groupName]; 指定nginx以誰的身份來運行 三、pid /path/to/file pid文件 四、worker_rlimit_nofile number; 設置全部worker進程一共能夠打開的文件的最大數量值 (linux上默認每一個用戶能夠打開1024個文件、套接字也是一個文件) 7、nginx性能優化相關配置 五、worker_processes number | auto; 設置發起幾個nginx的worker進程 number:應該比物理核心少一個 auto:讓系統自動判斷 六、worker_cpu_affinity cpumask ……| auto; 設置cpu掩碼,將worker進程綁定在一個固定的cpu 舉例: worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; 舉例: worker_processes 2; worker_cpu_affinity 0001 0100; 注意:能夠用auto,可是是1.9.10以後能夠用 七、time_resolution interval; 下降發起系統調用gettimeofday()次數 time_resolution 100ms; 八、worker_priority number; 修改worker進程的nice值(默認是0) 8、和事件相關的配置 九、accept_mutex on | off 設置master進程將客戶端的請求調度到worker進程的 調度方式:輪詢、隨機 on:使用輪詢 默認方式:off 十、accept_mutex_delay time; 默認500ms 設置master延遲多久纔將客戶端的請求調度到worker進程 十一、user [epoll|poll|select] 一般是不須要指定鏈接的處理方法(起始就是所使用的事件模型)的 建議讓系統自動判斷所要使用的方法 十二、worker_connections number; 指定每一個worker進程能夠處理的最大併發鏈接的數量 默認是1024 1三、master_process on | off; 指定是否使用master-worker 默認是:on 9、和調試和定位bug相關配置 1四、damon off | on 指定nginx工做在前臺仍是後臺 默認是 on 1五、error_log file [level]; 指定錯誤日誌的保存位置以及日誌級別 總結:常常要修改的參數 worker_processes worker_connections worker_cpu_affinity worker_priority 10、和http相關的配置 [root@156 ~]# vim /etc/profile.d/nginx.sh export PATH=$PATH:/usr/local/nginx/sbin [root@156 ~]# source /etc/profile.d/nginx.sh [root@156 ~]# nginx [root@156 ~]# nginx -s reload [root@156 ~]# ss -tnl | grep 80 上下文:http {指令} 例子:http{ 全局配置:對全部的虛擬主機都生效的配置 sendfile on; keepalive_timeout 10; …… 虛擬主機配置 server{ listen 80;指定該虛擬主機所監聽的端口 server_name www.lichao.com;指定虛擬主機的域名 root /vhost/web1;指定虛擬主機的網站根目錄 location /{ } } server{ } } 1六、server_name 設定虛擬主機的域名,可使用正則表達式來表示域名 適用範圍:server上下文中 server{ server_name www.zxhk.com; } server { server_name *.zxhk.com; } server { server_name www.zxhk.*; } server { server_name *; } server { server_name ~ ^.*\.www.zxhk.com; } www.zxhk.com 注意:nginx在進行域名匹配的時候,是有必定的規則,匹配次序以下 一、作精確匹配,server_name中的內容必須和用戶請求的內容徹底同樣 二、檢查左側的通配符 三、檢查右側的通配符 四、檢查通配符 五、檢查正則表達式 六、經過全部檢查都失敗,則訪問default_server,若是沒有指定default_server, 那麼第一個server就是default_server 1七、listen 指定所監聽的套接字 例子: listen 127.0.0.1:80; listen 172.0.0.1; listen 80; listen *:80; listen localhost:80; 1八、root 指定網站根目錄 使用範圍:http、server、location 注意:若是將root寫在了http部分,則會對所有的server都有效 例子: [root@156 ~]# cd /etc/nginx/ [root@156 nginx]#cp nginx.conf{,.bak} [root@156 nginx]#vim nginx.conf [root@156 ~]# mkdir -pv /vhost/web1 [root@156 ~]# echo "<h1>test for web1</h1>">/vhost/web1/index.html [root@156 ~]# cat /vhost/web1/index.html [root@156 ~]# nginx -s reload http://192.168.70.156/ test for web1 1九、location location [ = | ~ | ~* | ^~ ] uri {……} url:統一資源定位符 uri:統一資源標識符 server{ server_name www.zxhk.com; listen 80; location / { root /vhost/web1; } } 這裏的location的含義就是將用戶所訪問的根映射爲/vhost/web1路徑 有多個location的例子 server{ server_name www.zxhk.com; listen 80; location / { root /vhost/web1; } location /img/ { root /tmp/img; } location ~ \.php$ { root /phpfile; } } location做路徑映射的時候,有多種方式 不帶符號 = ~ ~* ^~ 一、不帶符號,以下 location /img { root /vhost/web1; } http://www.baidu.com/img http://www.baidu.com/a.html 二、= 表示的是精確匹配 location = /img { root /vhost/web1; } 要求只有用戶所請求的uri和location所指定的uri必須 徹底一致,不然匹配失敗,以下 http://www.baidu.com/img <<匹配成功 http://www.baidu.com/img/index.html <<匹配失敗 三、~表示對用戶所請求的uri作正則表達式,檢查過程當中區分大小寫 location ~ .jgp$ { root /vhost/web1; } 四、~*表示對用戶所請求的uri作正則表達式,檢查過程當中不區分大小寫 五、^~不對用戶所請求的uri作正則表達式檢查,而是隻檢查uri的左半部分 各類寫法的優先級 精確匹配優先級最高(=) uri的左半部檢查 區分大小寫的正則表達式檢查 不區分大小寫的正則表達式檢查 不帶符號的location location /img { root /vhost/web1; } [root@156 ~]# cd /vhost/web1/ [root@156 web1]# mkdir img [root@156 web1]# echo "this is test" >index.html [root@156 web1]# echo "this is image" >img/index.html http://192.168.70.156/ this is test http://192.168.70.156/img/index.html this is image [root@156 ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name www.zxhk.com; location / { root /vhost/web1/; } location /img/ { root /vhost/web2/; } } [root@156 ~]# cd /vhost/ [root@156 vhost]# mkdir web2 [root@156 vhost]# echo "this is web2" > web2/index.html [root@156 vhost]# source /etc/profile.d/nginx.sh [root@156 vhost]# nginx -s reload http://192.168.70.156/img 404 Not Found [root@156 vhost]# vim /var/log/nginx/error.log 2019/09/05 08:52:38 [error] 1915#0: *1 open() "/vhost/web1/favicon.ico" failed (2: No such file or directory), [root@156 vhost]# cd web2/ [root@156 web2]# ls index.html [root@156 web2]# mkdir img [root@156 web2]# mv index.html img/ http://192.168.70.156/img this is web2 20、alias path 將用戶所請求的uri映射爲一個指定的路徑 server { listen 80; server_name www.zxhk.com; location /img1/ { root /vhost/web1/; } location /img2/ { alias /vhost/web1/; } } cd /vhost/web1 ls echo "/vhost/web1">index.html mkdir img1 echo "/vhost/web1/img1">img1/index.html source /etc/profile.d/nginx.sh nginx -t nginx -s reload ls mkdir img2 echo "/vhost/web2/img/2">img2/index.html tree http://192.168.70.156/img2/ /vhost/web1 http://192.168.70.156/img2 404 Not Found vim /var/log/nginx/error.log 2019/09/05 09:51:08 [error] 2392#0: *13 open() "/usr/local/nginx/html/img2" failed (2: No such file or directory), client: 192.168.70.1, server: www.zxhk.com, request: "GET /img2 HTTP/1.1", host: "192.168.70.156"