Nginx安装及基础配置
- 版本选择:Mainline(奇数版本,开发版)、Stable(偶数版本,稳定版)、Legacy(旧稳定版)。源码编译安装优于yum,可自定义路径与功能模块。
- 依赖环境:需GCC编译器、Automake工具,以及pcre(正则支持)、zlib(gzip压缩)、openssl(HTTPS支持)等第三方库。
- 目录结构:
conf/
:存放核心配置文件nginx.conf
。html/
:默认Web文件及错误页面。logs/
:访问日志与错误日志。sbin/
:Nginx可执行文件。
Nginx架构与进程模型
- 进程分工:
- Master进程:管理Worker进程、加载配置、监听端口。
- Worker进程:处理客户端请求,竞争连接(epoll模型)。
- 通信机制:Master通过管道与Worker通信,Worker间通过共享内存交换数据。
核心配置
- 配置文件结构:
main
:全局配置(用户、进程数、日志等)。events
:连接处理模型(如use epoll
)。http
:HTTP协议相关(MIME类型、虚拟主机等)。
- 虚拟主机:通过
server
块配置,支持基于IP、端口、域名的区分。 - Location匹配:
=
:精确匹配。~
:正则匹配(区分大小写)。^~
:前缀优先匹配。
Nginx安装与基础配置
这里先把nginx24版的文件下好了直接拖进/mnt/目录
安装依赖包:
dnf install gcc pcre-devel zlib-devel openssl-devel -y
创建Nginx用户:
useradd -s /sbin/nologin -M nginx
解压并编译安装:
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
[root@Nginx nginx-1.24.0]# make && make install
配置环境变量:
echo "export PATH=$PATH:/usr/local/nginx/sbin" >> ~/.bash_profile
source ~/.bash_profile
启动与管理服务:
可以直接使用 nginx 命令,因为你已将其路径加入环境变量
nginx # 启动
nginx -s stop # 停止
nginx -s reload # 重新加载配置
验证 Nginx 运行状态
ps aux | grep nginx
此时curl - I localhost
应该会显示是nginx.1.24的版本
版本更新
同样的,把26版本下载好后拖进来解析编译
[root@webserver nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
26版本只需要make,就不必make install了,否则会冲突
检查语法有没有问题
如何让版本更新,覆盖掉24的进程?
Nginx服务管理配置
创建systemd服务文件:
vi /lib/systemd/system/nginx.service
服务文件内容:
[root@webserver system]# cat nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre:/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/sbin/nainx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s OUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
停止服务查看是不是正常关闭了,再重启
管理服务:
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
实现 nginx 的高并发配置
Nginx核心配置
虚拟机关机,加cpu,再启动
修改配置文件:
vi /usr/local/nginx/conf/nginx.conf
核心配置:
nginx -s reload重启服务
ps aux | grep nginx查看正在运行的进程
下载依赖
系统限制配置:
vi /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
文件虽然改了,但默认不生效,直接指定100000就行
现在就可以做压力测试了:
ab -c 5000 -n 10000 http://192.168.1.10/
或者 ab -c 5000 -n 10000 http://192.168.1.10/index.html
虚拟主机配置
新建一个pc web站点
创建配置文件目录:
mkdir -p /usr/local/nginx/conf.d/
创建虚拟主机配置:
vi /usr/local/nginx/conf.d/vhosts.conf
配置内容:
server {
listen 80;
server_name www.timinglee.org;
root /web/html;
index index.html;
}
主配置文件引入:
创建默认访问目录,往前端测试页面写东西
配置hosts解析:
vi /etc/hosts
192.168.1.10 webservera.timinglee.org www.timinglee.org
重启服务,访问测试
账户认证功能
当你输入密码和命令才能访问,否则访问不了,怎么设置
Nginx账户认证功能
命令:
-c 创建
m 文件
安装httpd-tools:
dnf install httpd-tools -y
创建认证文件:
#不想被别人看见可以在htpasswd前面加" . ",表示隐藏
htpasswd -cm /usr/local/nginx/.htpasswd admin
htpasswd -m /usr/local/nginx/.htpasswd lee
配置认证:
vi /usr/local/nginx/conf.d/vhosts.conf
location /login/ {
root /web/;
index index.html;
auth_basic "Please input username and password";
auth_basic_user_file /usr/local/nginx/.htpasswd;
}
验证时没有输入名字访问会被拒绝,需要加上名字
在浏览器验证访问时需要做解析
做实验的时候做curl就可以了
自定义错误页面同时指定响应状态码
创建错误页面目录和文件:
mkdir /web/errorpage
echo "出错误了" > /web/errorpage/error.html
默认情况下出错是这个页面,当你指定后出错就会跳到你指定的页面上
配置错误页面:
注意!:error_page参数中所有字符串只能用空格来分割。并且空格个数只能为1
error_page 500 502 503 504 404 /errorpage/error.html;
location /errorpage {
root /web/;
}
nginx -t检验内容有无问题
故意输错访问页面
指定错误日志
检测文件是否存在
长链接
长连接(Keep-Alive)是指在一个 TCP 连接上可以连续发送多个数据包,在发送完成后保持连接状态,而不是在每次发送数据后都关闭连接。这种方式减少了 TCP 连接建立和关闭的开销,在处理多个 HTTP 请求时可以显著提高性能,特别是对于频繁交互的 Web 应用。
长连接相关指令:
keepalive_timeout:超时时间。如果在超时时间内没有新的请求到达,连接将被关闭。
keepalive_requests:可以处理的最大请求数。当达到这个请求数后,连接将被关闭,客户端需要重新建立连接。
长连接的优缺点:
优点:减少 TCP 连接建立和关闭的开销,提高吞吐量,降低延迟。
缺点:长连接会占用服务器资源,如果长时间不释放,可能导致资源浪费。
测试长连接
前面是实验时看到效果的配置,测试完成后修改为下图
下载服务器配置
Nginx 可以配置为下载服务器,允许用户通过 HTTP 协议下载文件。通过启用自动索引功能,用户可以浏览服务器上的文件目录,并选择下载文件。
自动索引功能:
- autoindex on;:启用自动索引功能,当请求的 URL 对应一个目录时,Nginx 会生成一个包含该目录下所有文件的列表页面。
- autoindex_localtime on;:显示文件的本地时间。
- autoindex_exact_size off;:显示文件的大概大小(如 MB、GB)。
- autoindex_format html;:指定索引页面的格式为 HTML。
下载限速:
- set $limit_rate 1024k;:设置下载速度限制为 1024KB/s。这个参数可以防止单个用户占用过多带宽,影响其他用户的体验。
实验原理
自动索引生成:当用户请求一个目录时,Nginx 会检查该目录是否存在,并生成一个包含目录下所有文件的 HTML 页面。这个页面显示文件名、大小、修改时间等信息,并提供下载链接。
限速实现:Nginx 通过$limit_rate变量来限制每个连接的下载速度。
静态文件处理:Nginx 作为静态文件服务器,直接处理文件下载请求,无需通过后端应用服务器,因此性能较高。
示例:实现下载站点
#注意:download不需要index.html文件
创建共享资源存放目录:
mkdir /web/download
建立实验素材
配置下载服务:
创建一个location块,启用自动索引功能,并设置限速参数。
vi
location /download/ {
root /web/;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
autoindex_format html;
set $limit_rate 1024k;
}
#重启Nginx并访问测试下载页面
使用浏览器或下载工具访问该目录,检查是否可以浏览文件列表并下载文件。
检查下载速度是否符合限速设置测试下载功能:
在服务器上创建一个测试目录,并添加一些文件。
使用浏览器或下载工具访问该目录,检查是否可以浏览文件列表并下载文件。
检查下载速度是否符合限速设置
nginx状态页
在子配置文件中加入状态页location
配置 Nginx 压缩功能
在编辑Nginx 主配置文件中启用 gzip
压缩功能,减少传输数据量,提升页面加载速度。
#参数说明
gzip on;
gzip_comp_level 4; # 压缩级别(1-9,数值越高压缩率越大,但 CPU 消耗增加)
gzip_disable "MSIE [1-6]\."; # 禁用旧版 IE 浏览器压缩
gzip_min_length 4k; # 仅压缩大于 4KB 的文件
gzip_vary on; # 响应头添加 Vary: Accept-Encoding
gzip_static on; # 优先使用预压缩文件(如 .gz)
为了方便实验改为4k
文件内存大于4k就会被压缩
接下来查看文件内存,日志里面内存比较多,超过之后可以复制到我们需要测试的big.html文件中,让文件内存大于4k
如果日志文件内存较少,可以多运行几次日志
查看有没有成功,内存有没有增加
[root@webserver nginx]# du -sh /usr/local/nginx/html/big.html
有时候复制日志时候日志内容可能被清空了,所以复制后big.html内存没有任何增加
这个时候可以选择手动输入
[root@webserver conf.d]# cp /usr/local/nginx/logs/timinglee.org.access /usr/local/nginx/html/
[root@webserver conf.d]# echo hello > /usr/local/nginx/html/small.html
[root@webserver conf.d]# cp /usr/local/nginx/logs/timinglee.org.access /usr/local/nginx/html/big.html
-head:只请求HTTP头信息(HEAD方法)
--compressed:请求压缩内容
测试压缩效果:
curl --head --compressed http://192.168.1.10/big.html
另一个文件没有大于4K,所以不会压缩,通过-v可以查看里面写了什么
nginx Reweite环境
rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
其作用主要有:
- 美化与跳转 URL:让复杂 URL 变简洁易记,网站结构变化时实现平滑跳转。
- 流量分配与负载均衡:按条件转发请求,实现简单流量分配和负载均衡。
- 安全防护:隐藏真实路径,拦截恶意请求,降低安全风险。
- 访问控制:依据用户身份或来源限制访问,管理权限。
- 优化体验:强制 HTTPS 加密,自动切换语言版本,提升用户体验。
解析源码
make&&make install编译并安装
配置常用内置变量
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
location /var {
default_type text/html;
echo $uri;
echo $remote_addr;
echo $args;
echo $is_args;
echo $document_root;
echo $document_uri;
echo $host;
echo $remote_port;
echo $remote_user;
echo $request_method;
echo $request_uri;
echo $request_filename;
echo $http_user_agent;
echo $server_addr;
echo $server_name;
echo $server_port;
echo $scheme;
echo $server_protocol;
echo $http_cookie;
echo $cookie_key1;
echo $http_HOST;
echo $arg_name;
}
}
访问时就会输出相应的内置变量对应的文件/地址/域名
Rewrite 重写规则
通过正则表达式修改 URL,实现重定向或伪静态。
- redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
- permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301
# 临时重定向(302)
location /test {
rewrite ^/test http://www.timinglee.org redirect;
}
# 永久重定向(301)
location /aaa {
rewrite ^/aaa http://www.timinglee.org permanent;
}
# 文件不存在时重定向
location / {
if (!-e $request_filename) {
rewrite /(.*) https://$host/index.html;
}
}
默认不能显示重启后的页面
要访问得加上-L
break和last区别案例
在 Nginx 中,break和last指令都用于对请求进行控制,但它们存在多方面区别:
作用域与执行流程
break:仅在当前location作用域内生效,当break指令被执行后,会立即中断当前location内后续由ngx_http_rewrite_module模块相关指令(比如rewrite)的执行 ,但不会影响其他location的匹配。如果后续还有其他模块指令,依然会继续执行。例如:
nginx location /test { rewrite ^/test /new_url break; echo "This won't be executed if rewrite is triggered"; }
上述示例中,当rewrite规则触发,break指令执行,echo指令就不会被执行。
last:不仅会终止当前location中ngx_http_rewrite_module模块后续指令的执行,还会重新发起一次新的location匹配查找。也就是说,执行last后,Nginx 会停止当前location内后续的重写操作,并根据修改后的 URI,从server块的location配置中重新寻找匹配的location 。示例如下:nginx location /test { rewrite ^/test /new_location last; echo "This won't be executed if rewrite is triggered"; } location /new_location { return 200 "New location reached"; }
这里rewrite触发last后,Nginx 会重新匹配location,进而执行/new_location对应的配置。
创建测试用例到默认目录中
修改文件
做重定向后
访问TT时候重定向到test1,test1又重定向到lee页面
主要就是修改名字和重定向,看访问出来的是哪一个文件,以及我们要重定向到哪一个文件怎么设置
last和break的区别案例
完整页面重定向对比
全栈加密
全栈加密是指在系统或应用程序的各个环节,包括数据传输、存储、处理等层面都采用加密技术,以保障数据安全。
- 传输加密:用 HTTPS 协议(基于 SSL/TLS)建立安全连接,确保数据传输过程加密。
- 存储加密:对数据库、文件系统中的数据加密,防止存储介质被攻击时数据泄露。
- 应用层加密:代码中对敏感数据加密处理,API 交互时加密数据。
- 客户端加密:浏览器或移动客户端对数据加密后再传输。
- 密钥管理:妥善管理加密密钥的生成、存储等全周期,保障加密有效性。
全站加密实验旨在实现所有 HTTP 请求强制跳转至 HTTPS,确保客户端与服务器的通信全程加密。
基本配置
1. 生成自签名证书(测试用1.):
openssl req -newkey rsa:2048 -nodes -sha256 \
-keyout /usr/local/nginx/certs/timinglee.org.key \
-x509 -days 365 -out /usr/local/nginx/certs/timinglee.org.crt
2. https的基本配置
Nginx 配置示例:
server{
listen 80;
listen 443 ssl;
server_name www.timinglee.org;
root /web/html;
index index.html;
error_page 500 502 503 504 404 /errorpage/error.html;
error_log /usr/local/nginx/logs/timinglee.org.err;
access_log /usr/local/nginx/logs/timinglee.org.access;
ssl_certificate /usr/local/nginx/certs/timinglee.org.crt;
ssl_certificate_key /usr/local/nginx/certs/timinglee.org.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
强制 HTTP 跳转到 HTTPS:
增加一行location
location / {
if ($scheme = http) {
rewrite /(.*) https://$host/$1;
}
}
3. 验证并重启 Nginx
检查配置文件语法是否正确:
nginx -t
nginx -s reload
测试全站加密效果
- 浏览器访问
http://www.timinglee.org(你的域名)
,观察是否自动跳转至https://
版本。
注意:!实验完记得把把全站加密的删掉,以防我们做其他的实验有影响
当我们访问一个不存在的站点,应是404
如果客户要一个网页,我们没有,直接说没有,客户下次可能就不来了
那我们要如何处理一个不存在的文件呢?可以把它重定义成主站点,让客户可以转到这里
#是一个临时的,因为只有文件不存在时才转
防盗链配置
理解盗链机制
盗链是指其他网站直接链接并使用你的服务器上的资源(如图片、视频、文件等),而不经过你的网页。这会消耗你的服务器带宽和资源,导致额外成本。
如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗
链,referer就是之前的那个网站域名(用什么途径访问的)
那我们肯定不能让别人随意的动用我们的资源,怎么办呢?
识别盗链的关键因素
- 请求头中的
Referer
字段会显示资源请求的来源域名。 - 直接访问或合法来源的请求会有预期的
Referer
,而盗链请求通常来自外部域名。
其实每个用户/盗链者访问时都是有域名来源的,如果用户通过盗链的网页打开我们网站的资源,也会有显示
解决方法:限制资源仅允许特定来源访问
通过检查 Referer
字段来阻止非授权域名的访问
实验配置
新建一台服务器RS1:192.168.1.20
停止防火墙,永久关闭
要一个解析不然访问不了
添加域名
vi /etc/hosts
192.168.1.20 lee.timinglee.org
写一个网页,调用了网站上的一个图片
增加一个盗链目录
这样就可以盗用别人网页的图片链接
首先,可以查看客户是通过什么途径访问的
访问www.timinglee.org时日志有记录
当你访问网站时,控制你的访问流量从哪过来
如果你的referer值为空,可以直接访问
如果无效时,重定向到盗链页面
一般情况下,直接把无效referer限制不让访问就好了
反向代理与负载均衡
两台服务器RS1,RS2
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# vi /etc/hosts
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# echo 192.168.1.20 > /var/www/html/index.html
[root@RS1 ~]# mkdir /var/www/html/static/
[root@RS1 ~]# echo 192.168.1.20 static > /var/www/html/static/index.html
添加域名(两个都要)
关闭火墙 (两个都要)
下载服务httpd,php
[root@RS2 ~]# dnf install php -y
[root@RS2 ~]# dnf install httpd -y
启动服务(两个都要)
在 Linux 系统中,PHP 通常不是以php.service的名称运行的,而是作为 Apache(httpd)的模块运行
Mkdir /var/www/html/php/
Vi /var/www/html/php/index.php
Web服务器配置:反向代理隐藏后端服务器:
之前的全删了
记得每次修改后都要重启服务
当访问一个本机没有的页面时,可以对后端进行合理调度,转到其他服务器页面
负载均衡分配请求:
upstream webserver {
server 192.168.1.20:80 weight=2;
server 192.168.1.30:80;
server 192.168.1.10:8888 backup; # 备份节点
}
location / {
proxy_pass http://webserver;
}
反向代理缓存
现在有三台,server192.168.1.10
RS1 192.168.1.20
RS2 192.168.1.30
增加10的域名解析
搞缓存看一下
缓存功能默认关闭状态,需要先动配置才能启用
先写入主配置文件,创建缓存目录
目录会自动生成
缓存静态资源减轻后端压力:
proxy_cache_path /usr/local/nginx/cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=10g;
再进入
server{
listen 80;
server_name www.timinglee.org;
location /{
proxy_pass http://www.lee.org;
proxy_cache proxycache;
proxy_cache_key $request uri;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
location ~ \.(php|jsp|js)$ {
proxy_pass http://192.168.1.30:80;
}
Nginx 与 PHP-FPM 集成
PHP 请求转发配置:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
PHP 扩展(如 Memcache)
安装 Memcache :
前面我创建了一个fast_php目录,这里就直接把memcache文件拖进来了
后续需要用到一些命令,不可以直接使用,需要/path/file/+命令,如图:
想直接使用某些命令是需要配置环境变量的
编辑环境变量
环境变量配置完后
编译安装
./configure && make && make install
如果此时这里只有一个包,说明安装不全
./configure --with-php-config=/usr/local/php/bin/php-config
正常情况下
启动 Memcached 服务:
systemctl start memcached
配置php加载memcache模块
:wq退出保存
/word搜索单词(word替换成你想搜的)
:set nu显示行号
部署模块
端口一定是11211
复制测试文件到默认发布目录中
访问测试:
现在可以做访问测试了,但是因为前面做配置时我在默认发布目录/web/html/下创建了一个php目录,并创建了index.php页面,在访问页面时为了访问到index.php,默认发布目录是/web/html/php/,但实际我的默认访问目录是/web/html/,于是我将index.php转移到了主目录
原配置:
修改后的配置:
此时就可以通过主目录访问页面了,不过此时我们是不知道登陆密码的,所以要进入配置文件修改
可以看到用户名和密码
可以改成自己喜欢的名字和密码
登陆
现在里面的使用率为0,因为我们还什么都没写
那么现在我们往里面写入东西
[root@webserver html]# ab -n 1000 -c50 www.timinglee.org/example.php
全部写入失败率为0(有时候写入文件太多顾不过来就放弃了)
浏览器页面刷新一下
如果想重新测怎么办?只需要把这个服务重启,那么它的所有数据就会清零
systemctl restart memcached.service