Nginx網(wǎng)站服務(wù):從入門(mén)到LNMP架構(gòu)實(shí)戰(zhàn)
前言
說(shuō)起Web服務(wù)器,大家第一反應(yīng)可能是Apache,但作為一個(gè)在運(yùn)維路上摸爬滾打的技術(shù)人,我必須要為Nginx正名一下!這個(gè)由俄羅斯大神Igor Sysoev開(kāi)發(fā)的輕量級(jí)HTTP服務(wù)器,真的是我見(jiàn)過(guò)最"能打"的Web服務(wù)器之一。
為什么這么說(shuō)?單臺(tái)服務(wù)器能扛30000-50000個(gè)并發(fā)連接,內(nèi)存消耗還特別低,這性能簡(jiǎn)直逆天!今天就來(lái)分享一下我在實(shí)際項(xiàng)目中使用Nginx的經(jīng)驗(yàn),從基礎(chǔ)安裝到LNMP架構(gòu)搭建,希望能幫到正在學(xué)習(xí)的小伙伴們。
一、Nginx基礎(chǔ)安裝與配置
Nginx vs Apache 性能對(duì)比圖
┌─────────────────────────────────────────────────────────────────────┐ │ Nginx vs Apache 性能對(duì)比 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Nginx Apache │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ 并發(fā): 30K-50K │ │ 并發(fā): 1K-5K │ │ │ │ 內(nèi)存: 低 │ │ 內(nèi)存: 較高 │ │ │ │ CPU: 低 │ │ CPU: 較高 │ │ │ │ 模式: 異步事件 │ │ 模式: 進(jìn)程/線程 │ │ │ │ 靜態(tài)文件: 優(yōu)秀 │ │ 靜態(tài)文件: 良好 │ │ │ │ 配置: 簡(jiǎn)潔 │ │ 配置: 功能豐富 │ │ │ │ 負(fù)載均衡: 內(nèi)置 │ │ 負(fù)載均衡: 需模塊 │ │ │ │ 反向代理: 高效 │ │ 動(dòng)態(tài)內(nèi)容: 強(qiáng)大 │ │ │ └─────────────────────┘ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘
1.1 編譯安裝Nginx
首先我們需要準(zhǔn)備編譯環(huán)境,這一步很關(guān)鍵:
# 安裝必要的依賴包 [root@localhost ~]# yum -y install pcre-devel zlib-devel gcc++ gcc
為什么要安裝這些包?
?pcre-devel:支持正則表達(dá)式
?zlib-devel:支持gzip壓縮
?gcc++/gcc:編譯器
接下來(lái)創(chuàng)建專(zhuān)用用戶(安全第一):
# 創(chuàng)建nginx用戶,不允許登錄shell [root@localhost ~]# useradd -M -s /sbin/nologin nginx
Nginx 安裝流程圖
┌─────────────────────────────────────────────────────────────┐ │ Nginx 安裝配置流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ │ │ │ 1. 安裝依賴包 │ ← pcre-devel zlib-devel gcc │ │ └─────────────────┘ │ │ ↓ │ │ ┌─────────────────┐ │ │ │ 2. 創(chuàng)建運(yùn)行用戶 │ ← useradd -M -s /sbin/nologin nginx │ │ └─────────────────┘ │ │ ↓ │ │ ┌─────────────────┐ │ │ │ 3. 編譯安裝 │ ← ./configure && make && make install │ │ └─────────────────┘ │ │ ↓ │ │ ┌─────────────────┐ │ │ │ 4. 創(chuàng)建服務(wù)腳本 │ ← /etc/init.d/nginx │ │ └─────────────────┘ │ │ ↓ │ │ ┌─────────────────┐ │ │ │ 5. 啟動(dòng)測(cè)試 │ ← systemctl start nginx │ │ └─────────────────┘ │ │ │ │ 關(guān)鍵配置參數(shù): │ │ --prefix=/usr/local/nginx │ │ --user=nginx │ │ --group=nginx │ │ --with-http_stub_status_module │ │ │ └─────────────────────────────────────────────────────────────┘
1.2 編譯配置
這里是關(guān)鍵步驟,配置參數(shù)要仔細(xì):
[root@localhost ~]# tar zxf nginx-1.12.0.tar.gz [root@localhost ~]#cdnginx-1.12.0 # 配置編譯參數(shù) [root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx # 安裝目錄 --user=nginx # 運(yùn)行用戶 --group=nginx # 運(yùn)行組 --with-http_stub_status_module # 狀態(tài)統(tǒng)計(jì)模塊 # 編譯安裝 [root@localhost nginx-1.12.0]# make && make install
小技巧:創(chuàng)建軟鏈接方便使用
[root@localhost ~]#ln-s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1.3Nginx配置文件結(jié)構(gòu)
┌─────────────────────────────────────────────────────────────┐ │ Nginx 配置文件結(jié)構(gòu) │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 全局配置 (Global) │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ user nginx; │ │ │ │ │ │ worker_processes 1; │ │ │ │ │ │ error_log logs/error.log; │ │ │ │ │ │ pid logs/nginx.pid; │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 事件配置 (Events) │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ events { │ │ │ │ │ │ use epoll; │ │ │ │ │ │ worker_connections 4096; │ │ │ │ │ │ } │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ HTTP配置 (HTTP) │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ http { │ │ │ │ │ │ include mime.types; │ │ │ │ │ │ sendfile on; │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ │ │ 服務(wù)器配置 (Server) │ │ │ │ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ │ │ │ │ │ │ server { │ │ │ │ │ │ │ │ │ │ listen 80; │ │ │ │ │ │ │ │ │ │ server_name www.example.com; │ │ │ │ │ │ │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ 位置配置 (Location) │ │ │ │ │ │ │ │ │ │ │ │ location / { │ │ │ │ │ │ │ │ │ │ │ │ root html; │ │ │ │ │ │ │ │ │ │ │ │ index index.html; │ │ │ │ │ │ │ │ │ │ │ │ } │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ } │ │ │ │ │ │ │ │ │ └─────────────────────────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ } │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
核心配置示例:
# 全局配置 user nginx; # 運(yùn)行用戶 worker_processes 1; # 工作進(jìn)程數(shù)(建議=CPU核數(shù)) error_log logs/error.log; # 錯(cuò)誤日志 # 事件配置 events { use epoll; # 使用epoll模型(Linux推薦) worker_connections 4096; # 每個(gè)進(jìn)程最大連接數(shù) } # HTTP配置 http { include mime.types; default_type application/octet-stream; sendfile on; # 開(kāi)啟高效文件傳輸 keepalive_timeout 65; # 連接保持時(shí)間 server { listen 80; server_name www.example.com; location / { root html; index index.html index.htm; } } }
1.4 系統(tǒng)服務(wù)腳本
為了方便管理,我們創(chuàng)建一個(gè)系統(tǒng)服務(wù)腳本:
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash #chkconfig: - 99 20 #description: Nginx Service Control Script PROG="/usr/local/nginx/sbin/nginx" PIDF="/usr/local/nginx/logs/nginx.pid" case"$1"in start) $PROG ;; stop) kill-s QUIT $(cat$PIDF) ;; restart) $0stop $0start ;; reload) kill-s HUP $(cat$PIDF) # 重載配置,不中斷服務(wù) ;; *) echo"Usage:$0{start|stop|restart|reload}" exit1 esac exit0
# 添加執(zhí)行權(quán)限并注冊(cè)服務(wù) [root@localhost ~]#chmod+x /etc/init.d/nginx [root@localhost ~]# chkconfig --add nginx [root@localhost ~]# systemctl start nginx
二、Nginx訪問(wèn)控制
2.1 基于用戶認(rèn)證的訪問(wèn)控制
訪問(wèn)控制流程圖
┌─────────────────────────────────────────────────────────────┐ │ Nginx 訪問(wèn)控制機(jī)制 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 用戶請(qǐng)求 │────→│ Nginx │────→│ 認(rèn)證檢查 │ │ │ │ Request │ │ Server │ │ Auth? │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ ┌────────────┼────────────┐ │ │ ▼ │ ▼ │ │ ┌─────────────┐ │ ┌─────────────┐ │ │ │ 401 未授權(quán) │ │ │ 200 成功 │ │ │ │ 要求認(rèn)證 │ │ │ 返回內(nèi)容 │ │ │ └─────────────┘ │ └─────────────┘ │ │ ▲ │ ▲ │ │ │ │ │ │ │ 認(rèn)證失敗 認(rèn)證成功 │ │ │ │ 配置示例: │ │ auth_basic "管理員區(qū)域"; │ │ auth_basic_user_file /path/to/passwd; │ │ │ └─────────────────────────────────────────────────────────────┘
有時(shí)候我們需要對(duì)某些目錄進(jìn)行保護(hù),這時(shí)候用戶認(rèn)證就派上用場(chǎng)了:
# 安裝htpasswd工具 [root@localhost ~]# yum install -y httpd-tools # 創(chuàng)建用戶密碼文件 [root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db admin New password: Re-typenew password: Adding passwordforuser admin
設(shè)置文件權(quán)限(重要):
[root@localhost ~]#chmod400 /usr/local/nginx/passwd.db [root@localhost ~]#chownnginx /usr/local/nginx/passwd.db
配置nginx.conf:
server { location /admin { auth_basic"管理員區(qū)域"; # 認(rèn)證提示信息 auth_basic_user_file /usr/local/nginx/passwd.db; # 密碼文件路徑 root html; index index.html; } }
2.2 基于IP的訪問(wèn)控制
這個(gè)功能在實(shí)際項(xiàng)目中超級(jí)實(shí)用,比如只允許辦公網(wǎng)IP訪問(wèn)后臺(tái):
server { location /admin { deny 192.168.1.100; # 拒絕特定IP allow 192.168.1.0/24; # 允許整個(gè)網(wǎng)段 allow 10.0.0.0/8; # 允許內(nèi)網(wǎng) deny all; # 拒絕其他所有IP } }
規(guī)則執(zhí)行順序:從上到下,匹配到就停止!
三、虛擬主機(jī)配置
一臺(tái)服務(wù)器跑多個(gè)網(wǎng)站?沒(méi)問(wèn)題!Nginx的虛擬主機(jī)功能強(qiáng)大又靈活。
虛擬主機(jī)類(lèi)型對(duì)比
┌─────────────────────────────────────────────────────────────────────┐ │ Nginx 虛擬主機(jī)類(lèi)型 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 基于域名 │ │ 基于IP │ │ 基于端口 │ │ │ │ Name-based │ │ IP-based │ │ Port-based │ │ │ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ │ │ │? 同一IP不同域名 │ │? 不同IP同一端口 │ │? 同一IP不同端口 │ │ │ │? www.site1.com │ │? 192.168.1.10 │ │? :8080 │ │ │ │? www.site2.com │ │? 192.168.1.11 │ │? :8081 │ │ │ │ │ │ │ │ │ │ │ │優(yōu)點(diǎn):最常用 │ │優(yōu)點(diǎn):完全隔離 │ │優(yōu)點(diǎn):簡(jiǎn)單易配 │ │ │ │缺點(diǎn):需要域名 │ │缺點(diǎn):需要多IP │ │缺點(diǎn):端口管理 │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘
3.1 基于域名的虛擬主機(jī)
這是最常用的方式,一個(gè)IP綁定多個(gè)域名:
# 準(zhǔn)備網(wǎng)站目錄 [root@localhost ~]#mkdir-p /var/www/html/{site1,site2} [root@localhost ~]#echo"Site1 Homepage"> /var/www/html/site1/index.html [root@localhost ~]#echo"Site2 Homepage"> /var/www/html/site2/index.html
nginx配置:
# 網(wǎng)站1 server { listen 80; server_name www.site1.com; access_log logs/site1.access.log; location / { root /var/www/html/site1; index index.html; } } # 網(wǎng)站2 server { listen 80; server_name www.site2.com; access_log logs/site2.access.log; location / { root /var/www/html/site2; index index.html; } }
3.2 基于端口的虛擬主機(jī)
當(dāng)域名不夠用時(shí),可以用不同端口:
server { listen 8080; server_name localhost; location / { root /var/www/html/site1; index index.html; } } server { listen 8081; server_name localhost; location / { root /var/www/html/site2; index index.html; } }
四、LNMP架構(gòu)搭建
重頭戲來(lái)了!LNMP(Linux + Nginx + MySQL + PHP)是我最喜歡的Web架構(gòu)組合。
LNMP架構(gòu)圖
┌─────────────────────────────────────────────────────────────────────┐ │ LNMP 架構(gòu)圖 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ 用戶請(qǐng)求 │ │ │ │ HTTP Request│ │ │ └──────┬──────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Nginx │ │ │ │ (Web服務(wù)器/反向代理) │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ │ │ 靜態(tài)文件 │ │ PHP請(qǐng)求 │ │ │ │ │ │ 直接返回 │ │ 轉(zhuǎn)發(fā)給FPM │ │ │ │ │ │ .css .js .png │ │ .php文件 │ │ │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────┬───────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ PHP-FPM │ │ │ │ (PHP進(jìn)程管理器) │ │ │ │ 處理PHP腳本,連接數(shù)據(jù)庫(kù) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ Worker1 │ │ Worker2 │ │ Worker3 │ │ Worker4 │ │ │ │ │ │ Process │ │ Process │ │ Process │ │ Process │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────────────────┬───────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ MySQL │ │ │ │ (數(shù)據(jù)庫(kù)服務(wù)器) │ │ │ │ 存儲(chǔ)和管理數(shù)據(jù) │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ 數(shù)據(jù)庫(kù)表: users, posts, products, orders... │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ 通信端口: │ │ ? Nginx: 80/443 │ │ ? PHP-FPM: 9000 (FastCGI) │ │ ? MySQL: 3306 │ │ │ └─────────────────────────────────────────────────────────────────────┘
4.1 MySQL安裝配置
# 安裝編譯依賴 [root@localhost ~]# yum -y install ncurses-devel gcc-c++ cmake # 編譯安裝MySQL [root@localhost ~]# tar -zxf mysql-5.6.36.tar.gz [root@localhost ~]#cdmysql-5.6.36 [root@localhost mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc [root@localhost mysql-5.6.36]# make && make install
初始化數(shù)據(jù)庫(kù):
[root@localhost ~]# groupadd mysql [root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql [root@localhost ~]#chown-R mysql:mysql /usr/local/mysql # 初始化數(shù)據(jù)庫(kù) [root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
4.2 PHP-FPM安裝配置
PHP-FPM是關(guān)鍵組件,負(fù)責(zé)處理PHP請(qǐng)求:
# 安裝PHP依賴 [root@localhost ~]# yum -y install gd libxml2-devel libjpeg-devel libpng-devel # 編譯PHP [root@localhost ~]# tar -zxf php-5.5.38.tar.gz [root@localhost ~]#cdphp-5.5.38 [root@localhost php-5.5.38]# ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-fpm # 關(guān)鍵:?jiǎn)⒂肍PM --enable-mbstring --with-gd [root@localhost php-5.5.38]# make && make install
配置PHP-FPM:
[root@localhost ~]#cd/usr/local/php5/etc/ [root@localhost etc]#cpphp-fpm.conf.default php-fpm.conf [root@localhost etc]# useradd -M -s /sbin/nologin php
關(guān)鍵配置項(xiàng):
# php-fpm.conf pid = run/php-fpm.pid user = php group = php pm.max_children = 50 # 最大子進(jìn)程數(shù) pm.start_servers = 20 # 啟動(dòng)時(shí)進(jìn)程數(shù) pm.min_spare_servers = 5 # 最小空閑進(jìn)程 pm.max_spare_servers = 35 # 最大空閑進(jìn)程
4.3 Nginx與PHP集成
這是LNMP架構(gòu)的核心配置:
server { listen 80; server_name www.example.com; root /var/www/html; index index.php index.html; # PHP文件處理 location ~ .php$ { root /var/www/html; fastcgi_pass 127.0.0.1:9000; # PHP-FPM監(jiān)聽(tīng)端口 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 靜態(tài)文件處理 location ~ .(css|js|png|jpg|gif|ico|svg)$ { expires 1y; add_header Cache-Control"public, immutable"; } }
4.4 測(cè)試LNMP環(huán)境
創(chuàng)建PHP測(cè)試文件:
[root@localhost ~]#mkdir/var/www/html [root@localhost ~]# vim /var/www/html/test.php
LNMP環(huán)境測(cè)試頁(yè)面"; echo"
"; // PHP版本信息 echo"PHP信息
"; echo"PHP版本:".phpversion() ."
"; echo"服務(wù)器時(shí)間:".date('Y-m-d Hs') ."
"; // 測(cè)試MySQL連接 echo"MySQL連接測(cè)試
"; $link=mysqli_connect('localhost','root','123456'); if($link) { echo"MySQL連接:成功
"; $version=mysqli_get_server_info($link); echo"MySQL版本:".$version."
"; mysqli_close($link); }else{ echo"MySQL連接:失敗
"; echo"錯(cuò)誤信息:".mysqli_connect_error() ."
"; } // 顯示PHP擴(kuò)展 echo"已加載的PHP擴(kuò)展
"; $extensions=get_loaded_extensions(); echo""; foreach($extensionsas$ext) { echo""; // 服務(wù)器信息 echo"? ".$ext."
"; } echo"服務(wù)器信息
"; echo"操作系統(tǒng):".php_uname() ."
"; echo"Web服務(wù)器:".$_SERVER['SERVER_SOFTWARE'] ."
"; echo"文檔根目錄:".$_SERVER['DOCUMENT_ROOT'] ."
"; ?> AI寫(xiě)代碼php 運(yùn)行 
訪問(wèn)http://your-server-ip/test.php看到成功信息就OK了!
LNMP服務(wù)啟動(dòng)腳本
#!/bin/bash # LNMP一鍵啟動(dòng)腳本 echo" 啟動(dòng)LNMP服務(wù)..." # 啟動(dòng)MySQL echo"啟動(dòng)MySQL..." /usr/local/mysql/bin/mysqld_safe --user=mysql & sleep3 # 啟動(dòng)PHP-FPM echo"啟動(dòng)PHP-FPM..." /usr/local/php5/sbin/php-fpm # 啟動(dòng)Nginx echo"啟動(dòng)Nginx..." /usr/local/nginx/sbin/nginx echo" LNMP服務(wù)啟動(dòng)完成!" echo" 服務(wù)狀態(tài)檢查:" echo"MySQL:$(pgrep mysqld > /dev/null && echo ' 運(yùn)行中' || echo ' 未運(yùn)行')" echo"PHP-FPM:$(pgrep php-fpm > /dev/null && echo ' 運(yùn)行中' || echo ' 未運(yùn)行')" echo"Nginx:$(pgrep nginx > /dev/null && echo ' 運(yùn)行中' || echo ' 未運(yùn)行')"
五、性能優(yōu)化技巧
5.1 Nginx狀態(tài)監(jiān)控
啟用狀態(tài)統(tǒng)計(jì)模塊,實(shí)時(shí)監(jiān)控服務(wù)器狀態(tài):
location /nginx-status { stub_status on; access_log off; allow 127.0.0.1; # 只允許本機(jī)訪問(wèn) allow 192.168.1.0/24; # 允許內(nèi)網(wǎng)訪問(wèn) deny all; }
訪問(wèn)/nginx-status可以看到:
Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 AI寫(xiě)代碼
狀態(tài)說(shuō)明:
?Active connections: 當(dāng)前活躍連接數(shù)
?accepts: 已接受的連接數(shù)
?handled: 已處理的連接數(shù)
?requests: 總請(qǐng)求數(shù)
?Reading: 正在讀取請(qǐng)求頭的連接數(shù)
?Writing: 正在向客戶端寫(xiě)響應(yīng)的連接數(shù)
?Waiting: 空閑客戶端連接數(shù)
5.2 性能調(diào)優(yōu)參數(shù)
# 全局優(yōu)化 user nginx; worker_processes auto; # 自動(dòng)檢測(cè)CPU核數(shù) worker_cpu_affinity auto; # CPU親和性綁定 worker_rlimit_nofile 65535; # 工作進(jìn)程最大文件描述符 # 事件優(yōu)化 events { use epoll; # Linux下使用epoll worker_connections 65535; # 每個(gè)進(jìn)程最大連接數(shù) multi_accept on; # 一次接受多個(gè)連接 accept_mutex off; # 關(guān)閉accept鎖 } http { # 基礎(chǔ)優(yōu)化 sendfile on; # 開(kāi)啟高效文件傳輸 tcp_nopush on; # 優(yōu)化網(wǎng)絡(luò)包傳輸 tcp_nodelay on; # 減少網(wǎng)絡(luò)延遲 keepalive_timeout 30; # 連接保持時(shí)間 keepalive_requests 1000; # 每個(gè)連接最大請(qǐng)求數(shù) # 緩存優(yōu)化 open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # Gzip壓縮 gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/atom+xml image/svg+xml; # 緩沖區(qū)優(yōu)化 client_body_buffer_size 128k; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; }
5.3 系統(tǒng)內(nèi)核優(yōu)化
# /etc/sysctl.conf 系統(tǒng)內(nèi)核優(yōu)化 # 網(wǎng)絡(luò)優(yōu)化 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 1024 65535 # 文件描述符優(yōu)化 fs.file-max = 6815744 # 應(yīng)用生效 sysctl -p
5.4 PHP-FPM性能優(yōu)化
# php-fpm.conf 優(yōu)化配置 [global] pid = run/php-fpm.pid error_log =log/php-fpm.log log_level = warning [www] user = php group = php listen = 127.0.0.1:9000 listen.backlog = 65535 # 進(jìn)程管理優(yōu)化 pm = dynamic # 動(dòng)態(tài)進(jìn)程管理 pm.max_children = 100 # 最大子進(jìn)程數(shù) pm.start_servers = 20 # 啟動(dòng)時(shí)進(jìn)程數(shù) pm.min_spare_servers = 10 # 最小空閑進(jìn)程 pm.max_spare_servers = 30 # 最大空閑進(jìn)程 pm.max_requests = 1000 # 每個(gè)進(jìn)程最大請(qǐng)求數(shù) # 慢日志 slowlog =log/slow.log request_slowlog_timeout = 2 # 資源限制 rlimit_files = 65535 rlimit_core = 0
六、安全加固
6.1 隱藏版本信息
http { server_tokens off; # 隱藏Nginx版本 # 自定義Server頭 more_set_headers"Server: WebServer"; }
6.2 防止惡意請(qǐng)求
http { # 限制請(qǐng)求方法 map$request_method$not_allowed_method{ default 1; GET 0; POST 0; HEAD 0; } # 限制User-Agent map$http_user_agent$blocked_agent{ default 0; ~*malicious 1; ~*bot 1; ~*crawler 1; } server { # 拒絕不允許的請(qǐng)求方法 if($not_allowed_method) { return405; } # 拒絕惡意User-Agent if($blocked_agent) { return403; } # 防止目錄遍歷 location ~ /. { deny all; access_log off; log_not_found off; } # 限制文件上傳大小 client_max_body_size 10m; } }
6.3 SSL/TLS配置
server { listen 443 ssl http2; server_name www.example.com; # SSL證書(shū)配置 ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # SSL優(yōu)化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared10m; ssl_session_timeout 10m; # 安全頭 add_header Strict-Transport-Security"max-age=31536000; includeSubDomains"always; add_header X-Frame-Options DENY always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection"1; mode=block"always; # HTTP重定向到HTTPS error_page 497 https://$server_name$request_uri; }
七、監(jiān)控與日志
7.1 日志格式優(yōu)化
http { # 自定義日志格式 log_format main'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $upstream_response_time'; # JSON格式日志(便于分析) log_format json escape=json'{' '"time": "$time_iso8601",' '"remote_addr": "$remote_addr",' '"request": "$request",' '"status": $status,' '"body_bytes_sent": $body_bytes_sent,' '"request_time": $request_time,' '"upstream_response_time": "$upstream_response_time"' '}'; access_log logs/access.log main; error_log logs/error.log warn; }
7.2 日志輪轉(zhuǎn)
# /etc/logrotate.d/nginx /usr/local/nginx/logs/*.log{ daily # 每天輪轉(zhuǎn) missingok # 文件不存在不報(bào)錯(cuò) rotate 30 # 保留30天 compress # 壓縮舊日志 delaycompress # 延遲壓縮 notifempty # 空文件不輪轉(zhuǎn) create 644 nginx nginx # 創(chuàng)建新文件權(quán)限 postrotate /bin/kill -USR1 $(cat/usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || : endscript }
總結(jié)
通過(guò)這次完整的實(shí)戰(zhàn)分享,我們從零開(kāi)始搭建了一個(gè)完整的LNMP環(huán)境,涵蓋了:
核心知識(shí)點(diǎn)
1.Nginx基礎(chǔ)安裝
? 編譯安裝與配置
? 服務(wù)腳本創(chuàng)建
? 配置文件結(jié)構(gòu)理解
2.訪問(wèn)控制
? 基于用戶認(rèn)證
? 基于IP地址控制
? 安全策略配置
3.虛擬主機(jī)
? 基于域名的虛擬主機(jī)
? 基于端口的虛擬主機(jī)
? 多站點(diǎn)管理
4.LNMP架構(gòu)
? MySQL數(shù)據(jù)庫(kù)安裝
? PHP-FPM配置優(yōu)化
? Nginx與PHP集成
5.性能優(yōu)化
? 內(nèi)核參數(shù)調(diào)優(yōu)
? Nginx配置優(yōu)化
? 緩存策略配置
6.安全加固
? 版本信息隱藏
? 惡意請(qǐng)求防護(hù)
? SSL/TLS配置
實(shí)戰(zhàn)經(jīng)驗(yàn)分享
┌─────────────────────────────────────────────────────────────┐ │ Nginx實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié) │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 關(guān)鍵要點(diǎn): │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 1. 安全第一:專(zhuān)用用戶 + 權(quán)限控制 │ │ │ │ 2. 性能優(yōu)化:合理配置進(jìn)程數(shù)和連接數(shù) │ │ │ │ 3. 監(jiān)控重要:日志分析 + 狀態(tài)監(jiān)控 │ │ │ │ 4. 架構(gòu)清晰:理解各組件協(xié)作關(guān)系 │ │ │ │ 5. 持續(xù)學(xué)習(xí):跟進(jìn)新版本和最佳實(shí)踐 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 生產(chǎn)環(huán)境建議: │ │ ? worker_processes = CPU核數(shù) │ │ ? worker_connections = 10240-65535 │ │ ? 開(kāi)啟gzip壓縮節(jié)省帶寬 │ │ ? 配置SSL證書(shū)提升安全性 │ │ ? 定期備份配置文件 │ │ ? 監(jiān)控服務(wù)器資源使用情況 │ │ │ └─────────────────────────────────────────────────────────────┘
常用命令速查
# Nginx服務(wù)管理 nginx -t # 檢查配置文件語(yǔ)法 nginx -s reload # 重載配置(不中斷服務(wù)) nginx -s stop # 停止服務(wù) nginx -s quit # 優(yōu)雅停止 nginx -V # 查看編譯參數(shù) # 進(jìn)程管理 ps aux | grep nginx # 查看Nginx進(jìn)程 netstat -tlnp | grep :80 # 查看80端口占用 lsof -i :80 # 查看80端口進(jìn)程 # 日志分析 tail-f /usr/local/nginx/logs/access.log # 實(shí)時(shí)查看訪問(wèn)日志 tail-f /usr/local/nginx/logs/error.log # 實(shí)時(shí)查看錯(cuò)誤日志
Nginx真的是一個(gè)非常優(yōu)秀的Web服務(wù)器,在高并發(fā)場(chǎng)景下表現(xiàn)尤其出色。掌握了這些核心技能,相信大家在實(shí)際項(xiàng)目中能夠游刃有余地使用Nginx,搭建出高性能、高可用的Web服務(wù)!
記住:實(shí)踐是最好的老師,多動(dòng)手操作,多在生產(chǎn)環(huán)境中驗(yàn)證,才能真正掌握Nginx的精髓。
恭喜你完成了Nginx從入門(mén)到實(shí)戰(zhàn)的完整學(xué)習(xí)!繼續(xù)加油!
鏈接:https://blog.csdn.net/jxjdhdnd/article/details/148338688
-
Web
+關(guān)注
關(guān)注
2文章
1296瀏覽量
73024 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9995瀏覽量
90063 -
nginx
+關(guān)注
關(guān)注
0文章
180瀏覽量
12857
原文標(biāo)題:Nginx網(wǎng)站服務(wù):從入門(mén)到LNMP架構(gòu)實(shí)戰(zhàn)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【NanoPi NEO試用體驗(yàn)】之安裝配置Nginx環(huán)境WEB網(wǎng)站詳解
nginx錯(cuò)誤頁(yè)面配置
主要學(xué)習(xí)下nginx的安裝配置
介紹 Nginx的基本概念,性能,SSL 安裝

運(yùn)行nginx所需的最低配置
Nginx常用的配置和基本功能講解
搭建Keepalived+Lvs+Nginx高可用集群負(fù)載均衡

nginx負(fù)載均衡配置介紹

Nginx日常運(yùn)維方法Linux版

Nginx配置終極指南

評(píng)論