(Nginx)基于Nginx+PHP 驅動 Web 應用(上):配置文件與虛擬主機篇

1.應用場景

主要用于學習基于 Nginx + PHP 驅動 Web 應用(上):

配置文件與虛擬主機篇,學習弄清楚Nginx的常規操作,之前困惑的地方。

本文主要介紹了基于Nginx+PHP驅動Web應用的配置方法,重點講解了Nginx配置文件與虛擬主機設置。文章首先說明可通過Homestead等工具快速搭建Laravel運行環境,然后詳細解析了nginx.conf配置文件的結構和各模塊功能。核心內容圍繞虛擬主機配置展開,通過示例展示了如何為Laravel項目配置獨立的虛擬主機,包括監聽端口、域名解析、項目根目錄、索引文件設置等關鍵參數。特別強調了location塊的作用機制,以及如何通過FastCGI(PHP-FPM)處理PHP動態請求。文章還介紹了多站點部署時虛擬主機的管理方式,以及配置修改后的重啟注意事項,為后續深入理解Nginx+PHP工作流程奠定了基礎。

2.學習/操作

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 應用的完整流程。

后續補充

...

3.問題/補充

TBD

后續補充

...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95064.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【golang長途旅行第34站】網絡編程

網絡編程 基本介紹核心主題:?? Golang面向大規模后端服務程序的設計目標中,網絡通信是必不可少且至關重要的部分。?兩種網絡編程方式:???TCP Socket編程? ?性質:網絡編程的主流 ?底層協議:基于TCP/IP協議 ?舉…

Hadoop(六)

目錄:1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構1.Hadoop概述2.為什么需要分布式存儲3.分布式的基礎架構分析4.HDFS的基礎架構

Oracle 12g安裝

1. 下載地址 官方網站 一般這種導向的進入的都是oracle的官方網站(先登錄,如果沒有就創建賬號),并沒有真實的12g供你下載。需要你轉入Oracle的云中下載:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我選擇的是12.1.0.2.0下…

ros2--service/服務--接口

獲取service名稱const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());

安卓開發---SimpleAdapter

概念&#xff1a;SimpleAdapter 是 Android 中比 ArrayAdapter 更強大的適配器&#xff0c;用于將復雜的數據綁定到復雜的布局&#xff0c;支持將 Map 中的數據映射到布局中的多個 View。方法簽名&#xff1a;public SimpleAdapter( Context context, //上下文 List<? exte…

軟考-系統架構設計師 辦公自動化系統(OAS)詳細講解

個人博客&#xff1a;blogs.wurp.top 一、OAS的核心概念與演進 1. 什么是OAS&#xff1f; OAS是一個綜合性的信息系統&#xff0c;它利用計算機技術、通信技術、系統科學和行為科學&#xff0c;為組織的日常辦公事務、信息管理和協同工作提供支持。其本質是將傳統辦公流程電…

leetcode 155 官方golang標準答案錯誤

真是誤人子弟&#xff0c;leetcode155題官網的golang答案是錯誤的。push方法的append操作&#xff0c;必然不能保證是o(1)的時間復雜度。就這還是官網的標準答案&#xff0c;就這水平&#xff0c;&#x1f604;leetcode誤人子弟不是第一次了。光會刷算法&#xff0c;可惜水平還…

開源 python 應用 開發(十三)AI應用--百度智能云TTS語音合成

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

大白話說 AI 編程 Trae,小白進!

大家好&#xff0c;我是櫻木。 一些小白用戶&#xff0c;打開字節出的 AI 編程工具 Trae 時&#xff0c;可能覺得還是有點生疏&#xff0c;但是作為程序員&#xff0c;看到這樣的界面分布&#xff0c;已經是在熟悉不過了&#xff0c;甚至心中竊喜&#xff0c;長得和 IDEA 等開…

主流國產數據庫:文檔完備性

官方文檔通常是用戶獲取數據庫產品相關信息最權威的渠道&#xff0c;文檔的完備性&#xff08;準確、全面、易用&#xff09;直接影響著開發者的學習成本、項目實施的效率以及后期的運維便利性。 例如&#xff0c;Oracle 數據庫的官方文檔被廣泛認為是行業的黃金標準&#xff…

現今流行的操作系統及其應用場景

2025 年主流操作系統及其應用場景&#xff0c;結合技術趨勢與行業實踐&#xff0c;涵蓋從個人設備到關鍵基礎設施的全場景覆蓋&#xff1a;一、桌面與生產力領域1. Windows 11/12&#xff08;微軟&#xff09;市場地位&#xff1a;全球桌面市場占比 71%&#xff0c;企業級場景市…

IP v 6

相關概念地址長度128bit&#xff0c;采用冒號劃分為8段&#xff0c;并用16進制標識&#xff0c;其容量大到能為地球上的每一粒沙子分配一個地址&#xff0c;通常情況下其網絡前綴為64位&#xff0c;接口標識為64位&#xff0c;依照寫法可分為首選格式&#xff0c;即完整書寫&am…

Elasticsearch冷熱架構:性能與成本完美平衡

Elasticsearch 的冷熱架構&#xff08;Hot-Warm-Cold Architecture&#xff09;是一種針對時序數據&#xff08;如日志、指標等&#xff09;的成本與性能優化方案&#xff0c;通過將數據在不同生命周期的存儲需求分層處理&#xff0c;兼顧性能、容量和成本。其核心思想是&#…

【MFC自動生成的文件詳解:YoloClassMFC.cpp 的逐行解釋、作用及是否能刪除】

大家好&#xff0c;歡迎來到我的MFC編程入門系列。上次我們聊了MFC項目創建后的核心文件區別&#xff08;項目名.cpp、.h、Dlg.cpp 和 Dlg.h&#xff09;&#xff0c;今天針對讀者的反饋&#xff0c;專門來拆解其中最重要的一個文件&#xff1a;項目名.cpp&#xff08;這里以用…

玄機靶場 | 冰蝎3.0-jsp流量分析

文章目錄一、冰蝎3.0流量特征二、索引三、題目列表步驟#1黑客IP是什么&#xff1f;步驟#2黑客上傳的Webshell名是什么&#xff1f;步驟#3黑客上傳WebShell的時間是多少&#xff1f;&#xff08;格式如&#xff1a;flag{YYYY-MM-DD HH:MM:SS}&#xff09;步驟#4木馬的解密key是什…

基于物理信息神經網絡(Physics-Informed Neural Network, PINN)的三維熱傳導方程求解器MATLAB

代碼實現了一個基于物理信息神經網絡&#xff08;Physics-Informed Neural Network, PINN&#xff09;的三維熱傳導方程求解器。以下是詳細分析&#xff1a;&#x1f9e0; 一、主要功能 main.m&#xff1a; 構建一個全連接神經網絡用于近似三維熱傳導方程的解 ( u(x, y, z, t) …

按鈕計數器:jQuery / AngularJS / Vue / React / dagger.js 實現對比與技術解讀

代碼來源&#xff1a;https://codepen.io/dagger8224/pen/myeKgVQ 任務&#xff1a;實現“按鈕點擊 1”計數器&#xff0c;對比不同框架的寫法與特性&#xff0c;并給出選型建議。 目錄 代碼解讀&#xff08;逐框架&#xff09; jQuery&#xff08;命令式 DOM&#xff09;Angu…

useEffect中直接使用 await報錯

在 useEffect 中直接使用 await 會報錯&#xff0c;因為 useEffect 的回調函數不能是 async 函數。有幾種正確的方式來處理異步操作&#xff1a; 方法一&#xff1a;在 useEffect 內部創建 async 函數并立即調用 這是最常用的方式。 import React, { useEffect } from react;co…

卷積神經網絡為什么要填充(Padding)

填充&#xff08;Padding&#xff09;是卷積神經網絡中一個至關重要且巧妙的設計。它的核心目的可以概括為&#xff1a;為了解決卷積操作導致的特征圖尺寸縮小和邊緣信息丟失問題。

C++ 并發編程:全面解析主流鎖管理類

在 C 的并發世界里&#xff0c;管理共享資源就像是在一個繁忙的十字路口指揮交通。如果指揮不當&#xff0c;就會發生混亂甚至致命的“死鎖”。C 標準庫提供的各種鎖管理工具&#xff0c;就是我們手中的“交通信號燈”&#xff0c;它們各自擁有獨特的職能&#xff0c;幫助我們編…