•Nginx
•Apache
•IIS (Internet Information Services)
•Tomcat
Web服务器:遵循 HTTP 协议,接收、解析来自网络客户端(如浏览器)的请求,并做出相应的响应。这个响应可以是一个静态文件(如 HTML、图片),也可以是委托其他程序(如 PHP、Python)生成的动态内容。
1.Nginx源码包安装
1.下载源码包
yum install tar
tar -xf nginx-1.22.1.tar.gz
2.进入目录,使用./configure --help查看配置选项
- 通过--with-http_ssl_module参数,Nginx会在编译时集成ngx_http_ssl_module模块,从而支持以下功能:
- 提供HTTPS服务(监听443端口)。
- 加密客户端与服务器之间的通信(基于SSL/TLS协议)。
- 加载和管理SSL证书(如.crt和.key文件)。
yum -y install gcc make zlib-devel openssl-devel
./configure --with-http_ssl_module
make && make install
目录结构
如果是通过rpm包安装,配置文件在etc目录下
源码安装时,/usr/local/nginx/是标准默认目录
conf 与服务相关的配置文件
nginx.conf 服务的主配置文件
nginx.conf.default 模板文件
logs 日志文件
访问日志 access.log
错误日志 error.log
存放nginx的pid nginx.pid
html 网页脚本文件目录(.html .css .php)
默认首页文件 index.html
sbin
启动服务命令nginx
旧版本备份文件nginxold
基础使用
/usr/local/nginx/sbin/nginx 启动服务
-s stop 停止服务
-help 查看帮助
-v 版本信息
-V 版本号 + 编译详情 + 模块列表
补充1:alias别名
源码包安装方式可以使用较短命令使用nginx
1.编辑Bash:~/.bashrc
2.# 常用别名示例
a.alias ll='ls -l'
b.alias update='sudo apt update && sudo apt upgrade'
3.source ~/.bashrc
补充2:HTTP响应头
执行 curl -I http://目标网址
命令会发送一个 HTTP HEAD 请求,仅获取目标网址的响应头信息(不包含响应体)。返回的响应报文头包含服务器返回的元数据,用于描述资源状态、服务器配置和数据处理方式。
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Mon, 24 Mar 2025 07:24:33 GMT
Content-Type: image/jpeg
Content-Length: 5297531
Last-Modified: Thu, 20 Mar 2025 08:39:39 GMT
Connection: keep-alive
ETag: "67dbd44b-50d57b"
Content-Disposition: attachment;
Accept-Ranges: bytes
起始行为HTTP/1.1 200,这是响应报文头的标志(状态行),而非请求报文头(请求行如GET / HTTP/1.1)。
Server: nginx/1.26.3 服务器软件名称及版本号(如 Nginx、Apache)。
keep-alive字段明确表示此次连接是长连接,符合HTTP/1.1协议特性(默认支持连接复用)。
补充3: 源码包安装实现开机自启
1.创建服务文件 创建文件 /etc/systemd/system/nginx.service
sudo vim /etc/systemd/system/nginx.service
2.写入配置内容
将以下配置内容复制到文件中。请务必根据你的实际安装路径修改 PIDFile
、ExecStart
、ExecReload
、ExecStop
等指令的路径
。如果你的 Nginx 安装路径是默认的 /usr/local/nginx
,那么以下配置通常无需修改。
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
参数说明:
•Type=forking
: 表明 Nginx 服务将以守护进程(后台)模式运行。
•PIDFile=...
: 指定 Nginx 主进程的 PID 文件位置,Systemd 靠它来跟踪主进程。
•ExecStart=...
: 启动 Nginx 的命令。
•ExecReload=...
: 重新加载配置的命令(平滑重启)。
•ExecStop=...
: 停止 Nginx 的命令。
•WantedBy=multi-user.target
: 定义了在系统进入多用户模式时启动该服务
3.保存文件并退出编辑器
例如在 vim
中,按 Esc
后输入 :wq
回车。
4.重新加载 Systemd 配置
让 Systemd 识别新创建的服务文件
sudo systemctl daemon-reload
5.设置开机自启并启动服务
sudo systemctl enable nginx # 启用开机自动启动
sudo systemctl start nginx # 立即启动 Nginx 服务
2.Nginx服务进阶
平滑升级
1.升级之前可以先确认当前版本号和pid
/usr/local/nginx/sbin/nginx-V
/usr/local/nginx/sbin/nginx -V
netstat -utnalp | grep nginx
2.解压并进入新版本nginx包的目录
./configure --with-http_ssl_module
- 低版本用了哪些选项,高版本也应该包含
make
- 编译之后objs目录会多出可执行命令。这个目录是 Nginx 编译过程中的“工作间”和“仓库”,专门用于存放编译过程中产生的各种中间文件和最终产物。
3.在/usr/local/nginx/sbin/备份低版本的启动命令
cp nginx-1.25.4/objs/nginx /usr/local/nginx/sbin/ 拷贝高版本软件提供的启动命令
cd nginx-1.25.4 回到源码目录
makeupgrade 平滑升级
重新确认版本号和pid
/usr/local/nginx/sbin/nginx-V
/usr/local/nginx/sbin/nginx -V
netstat -utnalp | grep nginx
在执行makegrade后,会自动进行-t检查语法、自动结束nginx.pid、发送kill -USR2信号,处理完所有的用户请求了就将其结束等一系列操作。
用户验证
需要在nginx.conf手动填写验证的配置项
可在
server
块或location
块中添加
auth_basic "input your name and password"; # 弹出认证对话框时显示的提示信息
auth_basic_user_file /usr/local/nginx/conf/pass; # 指向第2步创建的密码文件路径
yum -y install httpd-tools
- 此命令用于安装 htpasswd工具,该工具专门用于生成和管理用于基本认证的密码文件
htpasswd -c /usr/local/nginx/conf/pass admin
- 创建密码文件,执行此命令后,会提示为 admin用户输入并确认密码
- c 参数表示 Create(创建),仅在第一次创建新文件时使用,后续不需要使用-c
/usr/local/nginx/sbin/nginx -s reload 可以重载前-t检查
虚拟主机(配置文件说明)
通过配置文件,让服务器根据不同域名、端口或IP区分请求,像有多台独立主机一样运行多个网站。
基于域名
•server
块:用于横向区分不同的网站(靠域名或端口)。
•location
块:用于纵向深入控制一个网站内部的不同请求(靠URI路径)。
# 博客网站的虚拟主机配置
server {
listen 80;
server_name www.myblog.com;
#location可以认为是匹配server_name也就是www.myblog.com后面的内容
#http://www.bbs.com/(匹配)或http://www.bbs.com/xxx.html(匹配)
location / { #当用户访问 www.bbs.com/这个路径时,就用这个location块的规则来处理。
root /data/www/blog; # 当请求匹配到 location /后,去服务器上哪个文件夹里找文件。
index index.html; # 默认首页文件
}
}
# 商城网站的虚拟主机配置
server {
listen 80;
server_name shop.myapp.com;
location / {
root /data/www/shop;
index index.html;
}
}
根据配置文件,创建不同的网页目录和其下的index.html文件,在
-t和-s reload
后即可测试。
1. server块:定义虚拟主机
•作用:每个 server { ... }块就代表一个独立的网站(虚拟主机)。
•如何工作:Nginx 通过检查浏览器请求中的 Host字段(例如 Host: www.myblog.com)来决定使用哪个 server块来响应。
2. listen指令
•作用:告诉 Nginx 这个虚拟主机监听哪个网络端口。
•示例:listen 80;表示监听标准的 HTTP 端口。两个 server块可以监听同一个端口。
3. server_name指令
•作用:指定这个虚拟主机负责的域名。这是实现“不同域名访问不同内容”的核心。
•server_name www.myblog.com;→ 这个块只处理访问 www.myblog.com的请求。
•server_name shop.myapp.com;→ 这个块只处理访问 shop.myapp.com的请求。
4. location块:处理特定请求
•作用:location里面写的内容是定义如何响应访问某个路径的请求。location / { ... }是最常见的,它匹配这个网站的所有请求(如 /, /about.html, /images/logo.png)。
•location /中的 / 代表的是 网站根目录的 URI,而不是服务器上的物理目录位置。换句话说,它匹配的是域名后面跟着的那部分路径。
•在上面的例子中,这个/会匹配所有以 /开头的请求,例如:
http://www.bbs.com/(匹配)
http://www.bbs.com/index.html(匹配)
http://www.bbs.com/users/login.php(匹配)
http://www.bbs.com/images/logo.png(匹配)
【如果配置为 location = /,则表示精确匹配根路径(仅匹配 http://localhost/,不包含子路径)。】
5. root指令
•作用:指定这个网站所有文件存放在服务器的哪个目录下。
•示例:root /data/www/blog;且请求 /index.html则Nginx 会去找 /data/www/blog/index.html文件。
6. index指令
•作用:当请求的是一个目录(如 /)时,Nginx 会自动尝试返回这个目录下的哪个文件作为首页。
•示例:index index.html;表示优先找 index.html文件。
基于端口或ip
Nginx 在处理一个请求时,会按照以下顺序选择使用哪个 server块来响应:
1.首先,匹配 listen指令:检查请求到达的 IP 和端口。
2.然后,匹配 server_name指令:检查请求头中的 Host字段(即域名)
3.当每个虚拟主机都监听独一无二的端口或IP+端口组合时,server_name就失去了匹配意义,因此可以任意设置。
4.注意:每个server块须指向独立资源目录。若所有的root配置相同(如均为/var/www/html),则无论访问哪个,Nginx都会返回该目录下的文件。若未显式配置index,Nginx会默认尝试加载index.html等文件。此时即使端口不同,只要默认文件名相同,返回内容必然一致。
######### 端口 8080 的网站 (公司官网) #########
server {
listen 8080; # 监听8080端口
server_name localhost; # 服务器名,此时可任意或保留localhost
location / {
root /www/port8080; # 网站文件存放目录
index index.html;
}
}
######### 端口 9090 的网站 (内部管理系统) #########
server {
listen 9090; # 监听9090端口
server_name localhost;
location / {
root /www/port9090;
index index.html;
}
}
使用端口区分时,listen处也可写作ip:端口。
######### IP 192.168.1.10 的网站 (对外官网) #########
server {
listen 192.168.1.10:80; # 监听指定IP的80端口
server_name _; # 因为通过IP区分,域名可指定也可以省略,常用_或default
location / {
root /www/ip_10;
index index.html;
}
}
######### IP 192.168.1.20 的网站 (内部后台) #########
server {
listen 192.168.1.20:80; # 监听另一个IP的80端口
server_name _;
location / {
root /www/ip_20;
index index.html;
}
}
补充1:nginx.conf文件配置
分层结构:全局 → Events → HTTP → Server → Location。
# 全局块(全局配置,影响整个Nginx)
user nginx; # 运行用户
worker_processes auto; # 工作进程数(通常设为CPU核心数)!
error_log /var/log/nginx/error.log warn; # 错误日志路径
# Events块(网络连接配置)
events {
worker_connections 1024; # 每个进程的最大连接数
}
# HTTP块(核心配置,包含所有HTTP相关设置)
http {
include /etc/nginx/mime.types; #加载一个文件类型对照表,使浏览器知道收到的文件的类型
default_type application/octet-stream; #设置默认的文件类型
# Server块(虚拟主机配置,可多个)
server {
listen 80; # 监听端口
server_name example.com; # 域名
# Location块(路由规则)
location / {
root /var/www/html; # 网站根目录
index index.html; # 默认首页
}
}
}
------------------------------------------------------------------------------------------
43.某企业使用 Nginx 作为Web服务器,由于近期业务侧所有员工需要经常查看某个实时销售数据,访问量较大,在不增加服务器情况下,以下哪几项能够提高业务访问的效率?【多选题】
ABD
A.在 nginx.conf 中配置提高types hash max size 的值
此参数用于调整MIME类型哈希表的大小(如.html映射为text/html),仅影响Nginx解析文件扩展名的效率。在高并发场景下,它对连接处理能力或响应速度几乎无影响,且默认值通常已足够。
B.在 nginx.conf 配置文件中提高worker connections的值
worker_connections决定每个worker进程可处理的并发连接数上限。访问量激增时,提高此值(如从默认1024提升至4096)可直接增加Nginx的总并发处理能力,避免连接被拒绝(返回502错误)。
C.在 nginx.conf 中配置tcp_nodelay 为off
此项需要保持打开,tcp_nodelay on(默认值)会禁用Nagle算法,立即发送小数据包,减少延迟,对实时性要求高的场景(如实时销售数据)至关重要。若设为off,数据包会等待累积再发送,显著增加响应延迟
D.在 nginx.conf 配置文件中提高worker_process 的值
worker_processes控制Nginx的工作进程数量。提高此值(如设为CPU核心数或更高)
补充2:nginx子配置文件
每个子配置文件定义一个server块(即一个虚拟主机),实现多站点隔离管理。
/etc/nginx/
├── nginx.conf # 主配置文件
├── conf.d/ # 子配置目录(通用)
└── sites-available/ # 可用站点配置(推荐)
└── sites-enabled/ # 启用站点的符号链接(实际加载目录)
1.创建子配置目录 (如果不存在)
2.在主配置文件的 http { ... }块内,添加一行 include指令,用于引入所有子配置文件。
http {
# 添加include指令,引入子配置文件
include /etc/nginx/conf.d/*.conf; # 路径可自定义,常用/etc/nginx/conf.d/或vhosts/
}
3.创建子配置文件
vim /etc/nginx/conf.d/game.conf
##########www.game.com############
server {
listen 192.168.88.52:8088;
#server_name www.game.com ;
location / {
root game;
index index.html index.php;
}
}
4.nginx -s reload
3.Nginx解释php脚本
•静态网站:服务器上存储的是预先制作好的固定HTML文件,内容不会自动改变。仅由前端技术(HTML, CSS, JavaScript)构成,服务器直接返回文件。
•动态网站:服务器上运行着程序(如PHP),该程序会根据每个请求实时生成不同的HTML页面。由后端技术(PHP, Java, Python等)生成前端代码(HTML, CSS, JS),然后由服务器发送给浏览器。
关闭SELinux和防火墙
yum install pcre-devel -y
主要用于源码装包支持正则表达式的开发与编译yum install -y php
解释器yum install -y php-devel
功能拓展包yum install -y php-fpm
服务,管理php进程。nginx服务接收到.php的网页请求时交给fpm处理。在/usr/local/nginx/html/ 添加一个测试用的php页面。
<?php
phpinfo();
?>
编辑nginx主配置文件nginx.conf
vim +65 /usr/local/nginx/conf/nginx.conf
打开时将光标直接定位在65行
location ~ \.php$ {
root /usr/local/nginx/html; # 通常需要指定明确的网站根目录
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 使用动态根目录
include fastcgi_params; # 引入通用参数集
}
1.location匹配到命名为xxx.php请求时执行以下操作。定义一个正则匹配规则,捕获所有以.php结尾的请求(如/index.php)。
i.正则表达式,\.转义点号,$匹配字符串结尾。~ 符号表示 区分大小写的正则表达式匹配。
2.设置PHP文件的根目录为html(相对路径,默认指向Nginx安装目录下的html文件夹)。
3.将PHP请求转发到本地的FastCGI进程(如PHP-FPM),监听端口为9000。需确保PHP-FPM服务已启动并监听该端口
4.当请求这里location匹配的目录时,默认加载的文件名。
i.假设请求的 URI 以斜杠 (/) 结尾时,Nginx 会自动将这个指定的索引文件(例如 index.php)附加到 URI 后面 ,请求 /api/ → 实际执行 /api/index.php
ii.该 location:~ \.php$ 仅匹配以 .php 结尾的请求(如 /test.php),而目录请求(如 /)不会进入此块,因此这里fastcgi_index不会生效
5.手动设置一个名为 SCRIPT_FILENAME的参数,告诉后端的 PHP-FPM:“请执行 /scripts目录下,名为 $fastcgi_script_name的文件”。
然而在同一 location块中已设置了root /html;,.php文件实际存放在这个html目录下(例如,访问 /index.php,服务器会去找 html/index.php)。
这行配置文件却让 Nginx 告诉 PHP-FPM 去一个名为 /scripts的绝对路径下找文件。因此,注释掉这行冲突的配置。
6.一般而言,include都应该修改为fastcgi.conf,专门解释php的变量名。还可以自适应在server或location块中root目录的更改。
7.检查:/usr/local/nginx/sbin/nginx -t
修改后:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
下图是fastcgi_params配置文件的标准内容。通过一系列 fastcgi_param指令,将 Nginx 接收到的客户端请求信息(如请求头、客户端IP、请求的URL等)和服务器自身的信息,转化为一系列环境变量,然后传递给后端的 PHP 处理器(例如 PHP-FPM)。
rpm -ql php-fpm
php-fpm软件包安装的所有文件rpm -qc php-fpm
(仅列出配置文件)
vim /etc/php-fpm.d/www.conf
注意此配置文件注释是;
原本的配置Unix Socket (/run/php-fpm/www.sock
),进程间通信 (IPC)。它假设Nginx和PHP-FPM安装在同一台服务器上,性能更好,因为通信不经过网络。
划将Web服务器(Nginx,处理静态请求) 和 应用服务器(PHP-FPM,处理动态请求) 拆分开,部署到两台或多台独立的服务器上时,就必须使用TCP Socket(127.0.0.1:9000)。
如果要使用socket,前面nginx的配置文件必须改为
fastcgi_pass unix:/run/php-fpm/www.sock;
由于前面已经配置了fastcgi_pass 127.0.0.1:9000;
此处不论是否同一台机器都必须修改
最后,systemctl enable php-fpm --now
开机自启
4.https和数据库
启用https
HTTPS就是在 HTTP 协议的基础上,增加了一个 SSL/TLS 加密层。这个加密层负责在浏览器和 Nginx 服务器之间建立一条安全通道,确保传输的数据无法被窃听或篡改。
HTTPS先用非对称加密来安全地交换密钥,然后再用对称加密来高效地加密实际传输的数据。
对称加密:加密和解密使用相同的密钥 (AES DES)
非对称加密:加密和解密使用不同的密钥 公钥负责加密数据 私钥负责解密数据 (RSA DSA)
SSL 指的是安全套接层(Secure Sockets Layer),是一种加密协议。SSL证书是实现该协议身份验证和密钥交换功能的数字凭证,它们密切相关,但不是一回事。
Nginx 服务器持有一对密钥:公钥和私钥。公钥放在 SSL 证书 中发送给浏览器,私钥自己严格保密。
浏览器用收到的公钥,加密生成一个随机的对称会话密钥,然后发送给服务器。服务器用自己的私钥解密,就能得到这个会话密钥。(RSA)
握手完成后,浏览器和服务器都拥有了相同的对称会话密钥。之后所有的 HTTP 请求和响应数据,都使用这个对称密钥进行高速的加密和解密。这是因为对称加密的计算效率远高于非对称加密。
启用https的前提是--with-http_ssl_module和openssl-devel已安装
cd /usr/local/nginx/conf/
openssl genrsa > cert.key
生成本地私钥 cert.keyopenssl req -new -x509 -key cert.key > cert.pem
i.这个步骤,就是在模拟权威机构(CA)的行为,为自己的服务器创建一张测试用的数字证书cert.pem,自己充当了“发证机关”。
ii.x509是证书国际标准X.509的格式,cert.key和cert.pem都是nginx默认调用的名称
iii.最终目的:将生成的 cert.pem(证书)和 cert.key(私钥)文件,配置到 Nginx 中,从而让网站能够启用 HTTPS 加密通信。
iiii.命令中的 req(request)会开启交互式输入一系列证书相关信息
修改nginx.conf 文件,启用ssl配置
vim +98 /usr/local/nginx/conf/nginx.conf
98,115 s/#//
通过vim将井号替换掉
# HTTPS server 配置块开始
server {
# 监听443端口,并启用SSL加密
listen 443 ssl;
# 指定服务器名称,可以是域名或IP地址
server_name localhost;
# 指定SSL证书文件路径(您生成的cert.pem文件)
ssl_certificate cert.pem;
# 指定SSL私钥文件路径(您之前生成的cert.key文件)
ssl_certificate_key cert.key;
# 设置SSL会话缓存,shared:SSL:1m表示所有工作进程共享的缓存,大小为1MB
ssl_session_cache shared:SSL:1m;
# 设置SSL会话超时时间为5分钟
ssl_session_timeout 5m;
# 配置加密算法套件,HIGH:!aNULL:!MD5表示使用高强度加密算法,禁用匿名和非MD5算法
ssl_ciphers HIGH:!aNULL:!MD5;
# 优先使用服务器端配置的加密算法套件
ssl_prefer_server_ciphers on;
# 定义处理请求的位置块
location / {
# 设置网站根目录(相对路径,通常相对于Nginx安装目录)
root html;
# 设置默认索引文件
index index.html index.htm;
}
}
/usr/local/nginx/sbin/nginx -s reload
使其生效临时验证:
C:\Windows\System32\drivers\etc\hosts
临时添加host使用https://域名访问。或curl -vk https://<你的服务器IP或域名>:<端口>
注意:Nginx 会根据请求的端口(80 or 443)和 Host头部(域名,如 example.com),从 http块内的所有 server块中挑选出唯一的一个来处理该请求。一个请求绝不会同时被两个 server块处理。
建议如果开启了https,将所有通过http的80端口的请求永久重定向(301) 到对应的HTTPS地址上。这样可以确保所有用户最终都访问到安全且一致的内容。
启用https+php
在https的server块处配置处理php的location即可。
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
补充:https访问过程
1. 域名解析(DNS查询)
•用户输入:https://www.example.com
•查询顺序:① 浏览器缓存 → ② 操作系统缓存 → ③ 路由器缓存 → ④ ISP(运营商)DNS缓存
•未命中缓存时:向根域名服务器(.) → 顶级域名服务器(com) → 二级域名服务器(example.com) → 三级域名服务器(www.example.com)逐级查询
•结果:获取目标服务器IP(如 10.8.8.168)
2. 建立安全连接(TCP三次握手 + SSL/TLS握手)
•步骤一 (TCP连接):三次握手
① 浏览器向服务器IP的443端口(默认HTTPS端口)发起SYN请求→ ② 服务器回复 SYN+ACK→ ③ 客户端回ACK
结果:建立可靠的TCP通信通道。(此为图中原步骤)
•步骤二 (SSL/TLS握手): ← 【此为HTTPS新增的核心步骤】
① Client Hello:浏览器告知服务器其支持的加密算法和SSL/TLS版本。
② Server Hello:服务器选择加密套件,并发送其SSL证书(含公钥)。
③ 验证证书:浏览器验证证书是否由可信机构颁发、是否过期、域名是否匹配。
④ 密钥交换:浏览器用证书中的公钥加密一个随机的会话密钥并发送给服务器。
⑤ 会话开始:服务器用私钥解密获取会话密钥。此后双方使用此密钥加密通信。
结果:在TCP连接之上,建立了一条加密的安全通道。
3. 发送加密请求与接收加密响应(HTTPS协议)
•浏览器发送HTTP请求:请求内容(如 GET /index.html)在发出前先由会话密钥加密。
•服务器返回响应:响应内容(HTML、CSS等)在返回前也先由会话密钥加密。
•状态码:同样包含 200、404等,但传输过程是加密的。
关键点:应用层协议仍然是HTTP,但所有数据在传输层都被SSL/TLS加密,变成了HTTPS。
4. 页面渲染(浏览器引擎工作)
•浏览器接收到加密的响应后,先用会话密钥解密。