 1.文檔閱讀 網絡協議概論 | Laravel 學院 - 基于 Nginx + PHP 驅動 Web 應用(上):配置文件與虛擬主機篇 PHP - PHP-FPM - 學習/實踐_穿素白衫的中少年的博客-CSDN博客?-- 推薦 2.整理輸出 Note 可結合PHP-FPM的配置文件一起學習 上篇教程學院君介紹了 Web 服務器的基本概念、簡單實現和工作流程,下面學院君將以兩篇教程的篇幅,以一個簡單的 Laravel 項目為例詳細介紹服務器端如何基于 Nginx + PHP-FPM 驅動 PHP Web 應用。 在開始介紹 Nginx 處理客戶端請求之前,我們先簡單介紹下 Nginx 服務器的配置文件。為此需要準備好 Laravel 項目服務端運行環境(Nignx + PHP-FPM + Laravel),我們可以基于?Homestead、Laradock、Laragon?或?Valet?快速搭建起這樣的環境。 做好上述準備工作后,打開 Nginx 的配置文件?nginx.conf (通常位于?/etc/nginx/nginx.conf ): user vagrant; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { ? ? ? ? worker_connections 768; ? ? ? ? # multi_accept on; } http { ? ? ? ? ## ? ? ? ? # Basic Settings ? ? ? ? ## ? ? ? ? sendfile on; ? ? ? ? tcp_nopush on; ? ? ? ? tcp_nodelay on; ? ? ? ? keepalive_timeout 65; ? ? ? ? types_hash_max_size 2048; ? ? ? ? # server_tokens off; ? ? ? ? server_names_hash_bucket_size 64; ? ? ? ? # server_name_in_redirect off; ? ? ? ? include /etc/nginx/mime.types; ? ? ? ? default_type application/octet-stream; ? ? ? ? ????????## ? ? ? ? # SSL Settings ? ? ? ? ## ? ? ? ? ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ? ? ? ? ssl_prefer_server_ciphers on; ? ? ? ? ????????## ? ? ? ? # Logging Settings ? ? ? ? ## ? ? ? ? access_log /var/log/nginx/access.log; ? ? ? ? error_log /var/log/nginx/error.log; ? ? ? ? ## ? ? ? ? # Gzip Settings ? ? ? ? ## ? ? ? ? gzip on; ? ? ? ? ## ? ? ? ? # Virtual Host Configs ? ? ? ? ## ? ? ? ? include /etc/nginx/conf.d/*.conf; ? ? ? ? include /etc/nginx/sites-enabled/*; } 該配置文件中提供了 Nginx 服務器的一些基本配置,Nginx 是由模塊驅動的,負責 HTTP 服務的是?http ?模塊,這里我們重點關注?http ?模塊中的虛擬主機配置(Virtual Host Configs)。 如果一臺服務器上只能部署一個 Web 站點顯然有點浪費,所以 HTTP/1.1 規范允許在一臺 HTTP 服務器上搭建多個 Web 站點,這個功能叫做虛擬主機(Virtual Host)。 所謂虛擬主機的意思是物理層面只有一臺服務器,但是通過虛擬主機功能可以在該服務器上搭建多個站點,從而讓訪問者覺得配備了多臺服務器。 基于 Nginx 驅動的所有 Web 站點都是通過?server ?模塊以虛擬主機的方式配置在各自的配置文件中,然后在?nginx.conf ?中通過?include /etc/nginx/sites-enabled/*; ?這行代碼引入。 我們看下 Nginx 自帶的一個虛擬主機配置?/etc/nginx/sites-enabled/default : server { ? ? ? ? listen 80 default_server; ? ? ? ? listen [::]:80 default_server ipv6only=on; ? ? ? ? root /usr/share/nginx/html; ? ? ? ? index index.html index.htm; ? ? ? ? # Make site accessible from http://localhost/ ? ? ? ? server_name localhost; ? ? ? ? location / { ? ? ? ? ? ? ? ? # First attempt to serve request as file, then ? ? ? ? ? ? ? ? # as directory, then fall back to displaying a 404. ? ? ? ? ? ? ? ? try_files $uri $uri/ =404; ? ? ? ? ? ? ? ? # Uncomment to enable naxsi on this location ? ? ? ? ? ? ? ? # include /etc/nginx/naxsi.rules ? ? ? ? } ? ? } 如果 Nginx 服務器沒有配置其它站點,則訪問 IP 地址解析到該服務器上的所有域名都會指向這個配置文件,因為這個配置文件監聽端口上指定了?default_server : listen 80 default_server; 由于是默認虛擬主機配置,所以一個 Nginx 服務器只允許配置一個標識為?default_server ?的虛擬主機。如果配置了多個,啟動 Nginx 的時候會報錯。 對于我們測試的 Laravel 項目,可以為其配置一個獨立的虛擬主機配置?/etc/nginx/sites-enabled/laravel : server { ? ? listen 80; ? ?// IPv4 ? ? listen [::]:80; ?// IPv6 ? ? server_name laravel.test; ? ? root /var/www/laravel/public; ? ? index index.php index.html index.htm; ? ? location / { ? ? ? ? ?try_files $uri $uri/ /index.php$is_args$args; ? ? } ? ? location ~ \.php$ { ? ? ? ? try_files $uri /index.php =404; ? ? ? ? fastcgi_pass unix:/run/php/php7.1-fpm.sock; ? ? ? ? fastcgi_index index.php; ? ? ? ? fastcgi_buffers 16 16k; ? ? ? ? fastcgi_buffer_size 32k; ? ? ? ? fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ? ? ? ? #fixes timeouts ? ? ? ? fastcgi_read_timeout 600; ? ? ? ? include fastcgi_params; ? ? } ? ? location ~ /\.ht { ? ? ? ? deny all; ? ? } ? ? error_log /var/log/nginx/laravel_error.log; ? ? access_log /var/log/nginx/laravel_access.log; } Nginx 服務器支持幾個 Web 站點,就配置幾個虛擬主機,通常的做法是將虛擬主機配置到?/etc/nginx/sites-available ?目錄下,然后對于啟用的站點,在?/etc/nginx/sites-enabled ?目錄下創建對應的軟鏈接。 在這個基本的 Laravel 站點虛擬主機配置中,主要包含監聽端口、站點域名、項目根目錄、默認索引、日志信息、以及?location ?配置塊. 我們大致介紹下這幾個配置的含義及用途: - 監聽端口(listen):本站點監聽的端口,一般默認是 80;
- 站點域名(server_name):本站點域名,由于一臺服務器上搭建了多個站點,而 TCP 連接的標識中只有 IP 地址和端口號,服務器如何識別客戶端訪問的是哪個站點呢?HTTP/1.1 的做法是要求請求首部中必須包含 Host 字段來指定訪問的域名,Nginx 在接收請求時,會將解析出來的 Host 首部字段值與虛擬主機中的 server_name 值進行匹配,匹配成功則應用該虛擬主機中的配置;
- 項目根目錄(root):站點部署的目錄,一般是入口索引文件所在的目錄;
- 索引文件:請求 URL 中未指定具體資源時默認的入口文件,可配置多個,然后以空格分隔。比如訪問 Laravel 應用首頁,一般請求起始行中的 URL 路徑是?
/ ,這個時候 Nginx 就會依次拼接?index ?配置中的索引文件進行訪問,比如?/index.php ; location ?配置塊:會與請求起始行中的相對 URL 路徑進行匹配,匹配成功則應用對應配置塊中的配置,location / {...} ?可以匹配所有請求,try_files ?會依次訪問后面配置的每個路徑,如果通過對應 URL 可以直接訪問($uri ),比如靜態資源文件,則直接返回響應給客戶端;否則嘗試以目錄方式訪問($uri/ );最后嘗試訪問?/index.php$is_args$args ,即以 Laravel 入口文件 + 動態參數形式訪問資源,由于該路徑包含了?.php ,所以會進入下一個匹配的?location ?配置塊 ——?location ~ \.php$ {...} ,然后通過 FastCGI 網關(PHP-FPM)讓后端 PHP 程序來處理動態請求。指定 PHP-FPM 進程時,可以通過 Unix 套接字,比如?unix:/run/php/php7.1-fpm.sock ,也可以通過 IP 地址+端口號的形式,比如?http://127.0.0.1:9000 ,前者僅適用于 PHP-FPM 與 Nginx 運行在一臺服務器,后者適用于所有場景,不過前者直接讀取本地文件,沒有額外的網絡開銷,因此從性能上來說更優,然后我們將請求的路徑、參數傳遞給 PHP-FPM,同時設置緩存和超時配置;- 日志信息:可以通過?
error_log ?指定錯誤日志路徑,access_log ?指定訪問日志路徑。 新增虛擬主機配置后,需要重啟 Nginx 讓其生效(Nginx 啟動過程中加載?nginx.conf ?配置文件),有了以上基本知識儲備后,下一篇我們將給大家介紹 Nginx + PHP-FPM 驅動 Laravel Web 應用的完整流程。 后續補充 ... |