nginx详细使用

目录

nginx安装

最小化安装

关闭debug功能

配置环境

设定开机启动脚本

查看配置文件

平滑升级

更改版本变量

平滑回滚

常用参数

-v

-t

reload

-g

全局配置参数

优化调整

cpu的核心绑定

event

创建一个站点

root

alias别名

location的详细使用

nginx账户认证功能

nginx自定义错误页面

nginx自定义日志

nginx中的文件检测

长连接设定

作为下载服务器进行配置

nginx状态页面

nginx数据压缩功能

nginx变量

内置变量

自定义变量

Rewrite相关功能

if判断

set设置

break中断

return返回

Rewrite指令

last和break

全站加密

防盗链

nginx方向代理功能

动静分离

缓存功能

反向代理负载均衡

方向代理示例

实现nginx四层负载

FastCGI

源码安装php

安装memcache


nginx安装

[root@nginx2 ~]# vmset.sh eth0 172.25.254.100 nginx.example.org

#解决依赖
[root@nginx2 ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y

[root@nginx ~]# tar zxvf nginx-1.26.1.tar.gz

#进入配置目录
[root@nginx2 ~]# cd nginx-1.24.0/
[root@nginx ~]# ./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@nginx2 nginx-1.24.0]# make -j2 

#拷贝文件到指定的位置
[root@nginx2 nginx-1.24.0]# make install

#创建用户
[root@nginx2 sbin]# useradd -s /sbin/nologin -M nginx

#启动nginx 默认一个主进程,一个worker进程
[root@nginx2 sbin]# ./nginx
[root@nginx2 sbin]# ps aux |grep nginx
root       40506  0.0  0.0   9860   932 ?        Ss   16:19   0:00 nginx: master process ./nginx
nginx      40507  0.0  0.1  13756  4864 ?        S    16:19   0:00 nginx: worker process
root       40509  0.0  0.0 221664  2376 pts/1    S+   16:19   0:00 grep --color=auto nginx

#查看端口
[root@nginx2 sbin]# netstat -antlupe | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          69139      40506/nginx: master 

#测试
[root@nginx ~]# curl -I 172.25.254.200
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Aug 2024 08:21:35 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 15 Aug 2024 08:17:34 GMT
Connection: keep-alive
ETag: "66bdb99e-267"
Accept-Ranges: bytes

#查看文件大小
[root@nginx ~]# cd /usr/local/nginx/sbin/
[root@nginx sbin]# du -sh nginx
5.5M	nginx

#关闭nginx
[root@nginx2 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@nginx2 ~]# netstat -antlupe | grep nginx

#重启
[root@nginx2 ~]# /usr/local/nginx/sbin/nginx -s restart

最小化安装

#删除软件
[root@nginx2 nginx-1.24.0]# rm -rf /usr/local/nginx/
#删除之前编译的东西
[root@nginx2 nginx-1.24.0]# make clean
rm -rf Makefile objs

#检查
[root@nginx ~]# ./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 ~]# make && make install

#大小
[root@nginx2 nginx-1.24.0]# du -sh /usr/local/nginx/sbin/nginx 
1.2M	/usr/local/nginx/sbin/nginx

关闭debug功能

[root@nginx2 nginx-1.24.0]# vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g"

配置环境

[root@nginx2 ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@nginx2 ~]# source ~/.bash_profile 

设定开机启动脚本

nginx默认情况下没有启动文件

#进入目录
[root@nginx ~]# cd /usr/local/nginx/sbin/

#创建文件
[root@nginx sbin]# vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

#使文件生效
[root@nginx sbin]# systemctl daemon-reload 

#检测
[root@nginx sbin]# nginx -s stop
[root@nginx sbin]# ps aux | grep nginx
root       52270  0.0  0.0 221664  2372 pts/1    S+   15:51   0:00 grep --color=auto nginx
[root@nginx sbin]# nginx
[root@nginx sbin]# ps aux | grep nginx
root       52272  0.0  0.0   9896   952 ?        Ss   15:51   0:00 nginx: master process nginx
nginx      52273  0.0  0.1  13808  4964 ?        S    15:51   0:00 nginx: worker process
root       52275  0.0  0.0 221664  2312 pts/1    S+   15:51   0:00 grep --color=auto nginx

查看配置文件

[root@nginx2 ~]# cd /usr/local/nginx/
[root@nginx2 nginx]# ls
client_body_temp  fastcgi_temp  logs        sbin       uwsgi_temp
conf              html          proxy_temp  scgi_temp

平滑升级

[root@nginx2 ~]# tar zxf echo-nginx-module-0.63.tar.gz 
[root@nginx2 ~]# tar zxf nginx-1.26.1.tar.gz
[root@nginx2 ~]# cd nginx-1.26.1/

#编译目录的时候,把niginx模块也加进去,让其内部可以运行
[root@nginx2 nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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  --add-module=/root/srcache-nginx-module-0.33  --add-module=/root/memc-nginx-module-0.20 
#不要install
[root@nginx2 nginx-1.26.1]# make

#编译好后生成obj文件夹,里面有nginx
[root@nginx2 nginx-1.26.1]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@nginx2 nginx-1.26.1]# cd objs/
[root@nginx2 objs]# ls
addon         nginx              ngx_auto_headers.h  src
autoconf.err  nginx.8            ngx_modules.c
Makefile      ngx_auto_config.h  ngx_modules.o

#进入运行环境
[root@nginx2 objs]# cd /usr/local/nginx/sbin/
[root@nginx2 sbin]# ll
total 1216
-rwxr-xr-x 1 root root 1242720 Aug 15 21:47 nginx

#把旧的nginx备份一份nginx.24
[root@nginx2 sbin]# cp nginx nginx.24

#用26的把24的覆盖
[root@nginx2 sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/nginx
[root@nginx2 sbin]# ls
nginx  nginx.24

老的nginx的进程,新的运行不了

新的怎么启动?用命令

#旧的进程
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9155  0.0  0.0   9860   932 ?        Ss   22:06   0:00 nginx: master process nginx
nginx       9156  0.0  0.1  13756  5408 ?        S    22:06   0:00 nginx: worker process
root        9193  0.0  0.0 221796  2360 pts/1    S+   22:14   0:00 grep --color=auto nginx

#只显示id
[root@nginx2 sbin]# pidof nginx
9156 9155

#回收旧版本
[root@nginx2 sbin]# kill -USR2 9155
[root@nginx2 sbin]# kill -WINCH 9155

更改版本变量

[root@nginx2 nginx-1.26.1]# cd src/core/
[root@nginx2 core]# vim nginx.h
#define nginx_version      1026001
#define NGINX_VERSION      "1.26.1"
#define NGINX_VER          "example/" NGINX_VERSION

平滑回滚

[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9155  0.0  0.0   9860  2568 ?        Ss   22:06   0:00 nginx: master process nginx
root        9195  0.0  0.1   9896  5924 ?        S    22:15   0:00 nginx: master process nginx
nginx       9196  0.0  0.1  13792  5300 ?        S    22:15   0:00 nginx: worker process
root        9219  0.0  0.0 221796  2372 pts/1    S+   22:37   0:00 grep --color=auto nginx
[root@nginx2 sbin]# kill -HUP 9155
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi
root        9155  0.0  0.0   9860  2568 ?        Ss   22:06   0:00 nginx
root        9195  0.0  0.1   9896  5924 ?        S    22:15   0:00 nginx
nginx       9196  0.0  0.1  13792  5300 ?        S    22:15   0:00 nginx
nginx       9225  0.0  0.1  13756  4868 ?        S    22:40   0:00 nginx
root        9227  0.0  0.0 221796  2376 pts/1    S+   22:41   0:00 grep 
[root@nginx2 sbin]# kill -WINCH 9195
[root@nginx2 sbin]# curl -I 172.25.254.200

把名字该回去,然后删掉

[root@nginx2 sbin]# ls
nginx  nginx.old
[root@nginx2 sbin]# cp nginx nginx.new
[root@nginx2 sbin]# ls
nginx  nginx.new  nginx.old
[root@nginx2 sbin]# \cp -f nginx.old nginx
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9155  0.0  0.0   9860  2568 ?        Ss   22:06   0:00 nginx: master process nginx
root        9195  0.0  0.1   9896  6424 ?        S    22:15   0:00 nginx: master process nginx
nginx       9225  0.0  0.1  13756  5408 ?        S    22:40   0:00 nginx: worker process
root        9258  0.0  0.0 221796  2372 pts/1    S+   22:45   0:00 grep --color=auto nginx
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9155  0.0  0.0   9860  2568 ?        Ss   22:06   0:00 nginx: master process nginx
root        9195  0.0  0.1   9896  6424 ?        S    22:15   0:00 nginx: master process nginx
nginx       9225  0.0  0.1  13756  5408 ?        S    22:40   0:00 nginx: worker process
root        9260  0.0  0.0 221796  2376 pts/1    S+   22:46   0:00 grep --color=auto nginx
[root@nginx2 sbin]# kill -9 9195
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9155  0.0  0.0   9860  2568 ?        Ss   22:06   0:00 nginx: master process nginx
nginx       9225  0.0  0.1  13756  5408 ?        S    22:40   0:00 nginx: worker process
root        9262  0.0  0.0 221796  2352 pts/1    S+   22:47   0:00 grep --color=auto nginx

常用参数

-v

#版本参数
[root@nginx2 sbin]# nginx -v
nginx version: example/1.26.1
#详细参数
[root@nginx2 sbin]# nginx -V
nginx version: example/1.26.1
built by gcc 11.3.1 20221121 (Red Hat 11.3.1-4) (GCC) 
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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

-t

检测配置文件语法

[root@nginx2 sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

#检测并打印
[root@nginx2 sbin]# nginx -T
[root@nginx2 sbin]# nginx -T
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# configuration file /usr/local/nginx/conf/nginx.conf:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

.....

reload

#在不关闭进程的情况下,重新加载配置
[root@nginx2 sbin]# nginx -s reload
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9276  0.0  0.0  10028  3488 ?        Ss   22:51   0:00 nginx: master process nginx
nginx       9286  0.0  0.1  13932  5068 ?        S    22:55   0:00 nginx: worker process
root        9289  0.0  0.0 221796  2372 pts/1    S+   22:55   0:00 grep --color=auto nginx
[root@nginx2 sbin]# nginx -s reload
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9276  0.0  0.0   9912  3500 ?        Ss   22:51   0:00 nginx: master process nginx
nginx       9291  0.0  0.1  13808  4924 ?        S    22:55   0:00 nginx: worker process
root        9293  0.0  0.0 221796  2360 pts/1    S+   22:55   0:00 grep --color=auto nginx

-g

#没有指定的时候,之开启一个master和一个worker
[root@nginx2 sbin]# nginx -s stop
[root@nginx2 sbin]# nginx
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9296  0.0  0.0   9896   952 ?        Ss   22:58   0:00 nginx: master process nginx
nginx       9297  0.0  0.1  13808  4944 ?        S    22:58   0:00 nginx: worker process
root        9301  0.0  0.0 221796  2372 pts/1    S+   22:59   0:00 grep --color=auto nginx

#记得注释,不然你指定不了
[root@nginx2 sbin]# vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;

#关机
[root@nginx2 sbin]# nginx -s stop
#指定
[root@nginx2 sbin]# nginx -g "worker_processes 6;"

[root@nginx2 sbin]# nginx
[root@nginx2 sbin]# ps aux | grep nginx
avahi        882  0.0  0.1  15528  6224 ?        Ss   21:41   0:00 avahi-daemon: running [nginx2.local]
root        9371  0.0  0.0   9896   952 ?        Ss   23:01   0:00 nginx: master process nginx -g worker_processes 6;
nginx       9372  0.0  0.1  13808  4948 ?        S    23:01   0:00 nginx: worker process
nginx       9373  0.0  0.1  13808  4876 ?        S    23:01   0:00 nginx: worker process
nginx       9374  0.0  0.1  13808  4812 ?        S    23:01   0:00 nginx: worker process
nginx       9375  0.0  0.1  13808  4948 ?        S    23:01   0:00 nginx: worker process
nginx       9376  0.0  0.1  13808  4884 ?        S    23:01   0:00 nginx: worker process
nginx       9377  0.0  0.1  13808  4896 ?        S    23:01   0:00 nginx: worker process
root        9381  0.0  0.0 221796  2356 pts/1    S+   23:03   0:00 grep --color=auto nginx

全局配置参数

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路
径,日志路径等。
user nginx nginx;
worker_processes 1; #启动工作进程数数量
events { #events #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多
个网络连接,使用哪种事件驱动模型 #处理请求,每个工作进程可以同时支持的
最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器
的时候最大并发数为 #worker_connections *
worker_processes,作为反向代理的时候为
#(worker_connections * worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格
式定义等绝大多数功能和第三方模块都 #可以在这设置,http块可
以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是
否启用sendfile、连接超时时间和 #单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是
否使用
#sendfile系统调用来传输文件
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在
内核中操作)
#从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率
很高,被称之为零拷贝,
#硬盘 >> kernel buffer (快速拷贝到kernelsocket
buffer) >>协议栈。
keepalive_timeout 65; #长连接超时时间,单位是秒
server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多
个location模块
#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个
server 可以使用一个端口比如都使用 #80端口提供web服务
listen 80; #配置server监听的端口
3.2 全局配置
Main 全局配置段常见的配置指令分类
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
全局配置说明:
server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr
内部的配置进程匹配。
location / { #location其实是server的一个指令,为nginx服务器提供比较
多而且灵活的指令
#都是在location中体现的,主要是基于nginx接受到的请求字符

#对用户请求的UIL进行匹配,并对特定的指令进行处理
#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
#另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使
用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html { #location处理对应的不同错误码的页面定
义到/50x.html
#这个跟对应其server中定义的目录下。
root html; #定义默认页面所在的目录
}
}
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
# ...
# } stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
}

优化调整

cpu的核心绑定
[root@nginx2 ~]# vim  /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  auto;   
worker_cpu_affinity 0001 0010;
[root@nginx2 ~]# nginx -s reload
[root@nginx2 ~]# ps aux | grep nginx
avahi        885  0.0  0.1  15532  6348 ?        Ss   17:30   0:00 avahi-daemon: running [nginx2.local]
root        3231  0.0  0.1  10028  3560 ?        Ss   17:42   0:00 nginx: master process nginx
nginx       3259  0.0  0.1  13932  4968 ?        S    17:44   0:00 nginx: worker process
nginx       3260  0.0  0.1  13932  4920 ?        S    17:44   0:00 nginx: worker process
root        3264  0.0  0.0 221796  2372 pts/0    S+   17:44   0:00 grep --color=auto nginx
#可以看见这个时候有两个worker
event
#最多能打开1024个文字符
[root@nginx2 ~]# ulimit -a
open files                         (-n) 1024

#更改
[root@nginx2 ~]# vim /etc/security/limits.conf
# End of file
nginx           -       nofile          10000
[root@nginx2 nginx]# sudo -u nginx ulimit -a
open files                          (-n) 10000

#更改配置文件
[root@nginx2 nginx]# vim  /usr/local/nginx/conf/nginx.conf
events {
    worker_connections  10000;
}

#压力测试
[root@nginx2 nginx]# ab -n 10000 -c 5000 http://172.25.254.200/index.html
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.254.200 (be patient)
socket: Too many open files (24)
创建一个站点
[root@nginx2 nginx]# vim  /usr/local/nginx/conf/nginx.conf
events {
    worker_connections  10000;
    use epoll;
}
    #gzip  on;  子配置文件路径,写在后面不生效噢
    include "/usr/local/nginx/conf.d/*.conf";

[root@nginx2 nginx]# mkdir -p /usr/local/nginx/conf.d
[root@nginx2 nginx]# mkdir -p /data/web/html
[root@nginx2 nginx]# echo www.example.org > /data/web/html/index.html

[root@nginx2 nginx]# vim /usr/local/nginx/conf.d/vhost.conf
server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
}

#重新加载nginx
[root@nginx2 nginx]# nginx -s reload

#在windows里面做域名解析
172.25.254.200  www.example.org
root
[root@nginx2 nginx]# mkdir /data/web/test1 -p
[root@nginx2 nginx]# echo /data/web/test1 > /data/web/test1/index.html
[root@nginx2 nginx]# vim /usr/local/nginx/conf.d/vhost.conf
server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
#它不会管前面的root噢~
    location /test1/ {
        root /data/web;
    }
}
[root@nginx2 nginx]# nginx -s reload
#查看日志
[root@nginx2 nginx]# tail /usr/local/nginx/logs/error.log
alias别名

输入test2实际访问的是alias里面的地址

server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    location /test1/ {
        root /data/web;
    }
    location /test2 {
        alias /data/web/test1;
    }
}    

location的详细使用

#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:
~/~* 
不带符号 
^~
=

#/data/web/test/index.html
location /test {
root /data/web;
}
#实际目录 /data/web/html/test/index.html
location test {
root /data/web;
}

nginx账户认证功能

#第一步:创建认证文件
[root@nginx ~]# htpasswd -cm /usr/local/nginx/.htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin
##.htpasswd隐藏文件,安全  记得结尾加用户

##如果只是增加用户,要把-c去掉,否则会覆盖
[root@nginx ~]# htpasswd -m /usr/local/nginx/.htpasswd lee
New password: 
Re-type new password: 
Adding password for user lee

##查看用户
[root@nginx ~]# cat /usr/local/nginx/.htpasswd
admin:$apr1$OWjOtehT$SvrN5paUET5pg.IOyOK030
lee:$apr1$3D6uKBrp$BmJGKK1uWzloILWxnZ8Cq0


#创建默认配置文件
[root@nginx ~]# mkdir -p /data/web
[root@nginx ~]# mkdir /data/web/lee
[root@nginx ~]# echo lee > /data/web/lee/index.html

#
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;

    location /lee {
        root /data/web;
        auth_basic "login password";
        auth_basic_user_file "/usr/local/nginx/.htpasswd";
    }
}
[root@nginx ~]# nginx -s reload

nginx自定义错误页面

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf 
server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    #404状态码重定向
    error_page 404 /40x.html;

    location /lee {
        root /data/web;
        auth_basic "login password";
        auth_basic_user_file "/usr/local/nginx/.htpasswd";
    }
    location = /40x.html {
        root /data/web/errorpage;
    }
}
[root@nginx ~]# mkdir -p /data/web/errorpage
[root@nginx ~]# echo errorpage > /data/web/errorpage/40x.html

nginx自定义日志

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf 
server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    error_page 404 /40x.html;
    #使用参数独立日志
    error_log /var/log/example.org/error.log;
    access_log /var/log/example.org/access.log;
[root@nginx ~]# mkdir /var/log/example.org
[root@nginx ~]# nginx -s reload

nginx中的文件检测

检测文件是否存在

server{
    listen 80;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    error_page 404 /40x.html;
    error_log /var/log/example.org/error.log;
    access_log /var/log/example.org/access.log;
    #先检测路径,路径下的html,路径下的index.html 然后错误页面
    try_files $uri $uri.html $uri/index.html /error/default.html;

500报错

[root@nginx ~]# curl nginx.example.org
exaple.org
[root@nginx ~]# rm -rf /data/web/html/index.html 
[root@nginx ~]# curl nginx.example.org
<html>
<head><title>500 Internal Server Error</title></head>
<body>
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@ng

建立文件

[root@nginx ~]# mkdir /data/web/html/error
[root@nginx ~]# echo error default > /data/web/html/error/default.html
[root@nginx ~]# 
[root@nginx ~]# 
[root@nginx ~]# curl nginx.example.org
error default

长连接设定

keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接,
默认为75s
#通常配置在http字段作为站点全局配置
keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量
#默认为100次,建议适当调大,比如:500

#下载测试工具
[root@nginx ~]# dnf install telnet -y

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_requests 3;
keepalive_timeout 65 60;
#第二个数字是显示等待多少秒,第一个数字是实际等待时间

#使用命令测试:
[root@nginx ~]# telnet lee.timinglee.org 80

作为下载服务器进行配置

[root@nginx ~]# mkdir /data/web/download
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
    location /download {
        root /data/web;
        autoindex on;
    }
[root@nginx ~]# mkdir /data/web/download
[root@nginx ~]# dd if=/dev/zero of=/data/web/download/leefile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0396294 s, 2.6 GB/s

#测试
[root@nginx ~]# curl nginx.example.org/download/
<html>
<head><title>Index of /download/</title></head>
<body>
<h1>Index of /download/</h1><hr><pre><a href="../">../</a>
<a href="leefile">leefile</a>                                            18-Aug-2024 13:10           104857600
</pre><hr></body>
</html>

调整时区

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
location /download {
        root /data/web;
        autoindex on;
        #真实时间
        autoindex_localtime on;
        #粗略大小
        autoindex_exact_size off;
        #限速 1M/s
        limit_rate 1024k;
    }

nginx状态页面

accepts: #统计总值,Nginx自启动后已经接受的客户端请求连接的总数。

handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数

#通常等于accepts,除非有因worker_connections限制等被拒绝的连接

requests: #统计总值,Nginx自启动后客户端发来的总的请求数

Reading: #当前状态,正在读取客户端请求报文首部的连接的连接数

#数值越大,说明排队现象严重,性能不足

Writing: #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大

Waiting: #当前状态,正在等待客户端发出请求的空闲连接数

[root@nginx ~]# cd /usr/local/nginx/conf.d/
[root@nginx conf.d]# vim vhost.conf 
[root@nginx conf.d]# vim status.conf
[root@nginx conf.d]# nginx -s relod
server {
    listen 80;
    server_name status.example.org;
    root /data/web/html;
    index index.html;
    location /status {
        stub_status;
        auth_basic "login";
        auth_basic_user_file "/usr/local/nginx/.htpasswd";

    }
}

指定用户访问

[root@nginx conf.d]# vim status.conf
server {
    listen 80;
    server_name status.example.org;
    root /data/web/html;
    index index.html;
    
    location /status {
        stub_status;
        allow 172.25.254.1;
        deny all;
    }
}
[root@nginx conf.d]# nginx -s reload

#拒绝
[root@nginx conf.d]# curl status.example.org/status
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

nginx数据压缩功能

[root@nginx conf.d]# vim /usr/local/nginx/conf/nginx.conf
	gzip  on;
    gzip_comp_level 5;
    gzip_min_length 1k;
    gzip_http_version 1.1;
    gzip_buffers number size;
    gzip_vary on;
	gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
[root@nginx conf.d]# nginx -s reload
[root@nginx conf.d]# nginx -t

[root@nginx conf.d]# echo hello example xixi > /data/web/html/small.html
[root@nginx conf.d]# cat /var/log/example.org/access.log > /data/web/html/big.html

测试

[root@nginx conf.d]# curl --head --compressed 172.25.254.100/small.html
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sun, 18 Aug 2024 14:02:58 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Sun, 18 Aug 2024 13:59:20 GMT
Connection: keep-alive
ETag: "66c1fe38-13"
Accept-Ranges: bytes

[root@nginx conf.d]# curl --head --compressed 172.25.254.100/big.html
...
Accept-Ranges: gzip

nginx变量

内置变量

$remote_addr;
#存放了客户端的地址,注意是客户端的公网IP

$args;
#变量中存放了URL中的所有参数
#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
#返回结果为: keyword=手机&enc=utf-8

$is_args
#如果有参数为? 否则为空

$document_root;
#保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。

$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令
#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var
#返回结果为:/var

$host;
#存放了请求的host名称
limit_rate 10240;

echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;
#已经经过Auth Basic Module验证的用户名
curl -u lee:lee ...

$request_body_file;
#做反向代理时发给后端服务器的本地资源的名称

$request_method;
#请求资源的方式,GET/PUT/DELETE等

$request_filename;
#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
#如:webdata/nginx/timinglee.org/lee/var/index.html

$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
#例如:/main/index.do?id=20190221&partner=search

$scheme;
#请求的协议,例如:http,https,ftp等

$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;
#保存了服务器的IP地址

$server_name;
#虚拟主机的主机名

$server_port;
#虚拟主机的端口号

$http_user_agent;
#客户端浏览器的详细信息

$http_cookie;
#客户端的所有cookie信息

$cookie_<name>
#name为任意请求报文首部字部cookie的key名

$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有横线需要替换为下划线
#示例:
echo $http_user_agent;
echo $http_host;
$sent_http_<name>

#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;
$arg_<name>

#此变量存放了URL中的指定参数,name为请求url中指定的参数
echo $arg_id;

[root@nginx2 ~]# cd /usr/local/nginx/conf.d
[root@nginx2 conf.d]# vim var.conf
server {
    listen 80;
    server_name var.example.org;
    root /data/web/html;
    index index.html;

    location /var {
        default_type text/html;
        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_filename;
        echo $request_uri;
        echo $scheme;
        echo $server_protocol;
        echo $server_addr;
        echo $server_name;
        echo $server_port;
        echo $http_user_agent;
        echo $http_cookie;
        echo $cookie_key2;
    }
}


[root@nginx2 conf.d]# vim /etc/hosts
172.25.254.200  nginx2.example.org  var.example.org

[root@nginx2 conf.d]# nginx -s reload
[root@nginx2 conf.d]#  curl -b "key1=lee,key2=lee1" -u lee:lee var.example.org/var?name=lee&&id=6666
172.25.254.200
name=lee
?
/data/web/html
/var
var.example.org
34732
lee
GET
/data/web/html/var
/var?name=lee
http
HTTP/1.1
172.25.254.200
var.example.org
80
curl/7.76.1
key1=lee,key2=lee1
lee1

自定义变量

set $example lisa  #做个声明在location里即可

[root@nginx2 conf.d]# vim var.conf
server {
    listen 80;
    server_name var.example.org;
    root /data/web/html;
    index index.html;

    location /var {
        default_type text/html;
        #设定内置变量
        set $timinglee lee;
        echo $timinglee;
    }
}
[root@nginx2 conf.d]# nginx -s reload

[root@nginx2 conf.d]#  curl -b "key1=lee,key2=lee1" -u lee:lee var.example.org/var?name=lee&&id=6666
lee

Rewrite相关功能

if判断

符号

=   #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~   #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~  #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~*  #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真

-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)

#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

实验
[root@nginx2 conf.d]# vim var.conf 
    location /test2 {
    #最终访问文件
    if ( !-e $request_filename ){
        echo "$request_filename is not exist";
    }
  }
[root@nginx2 conf.d]# nginx -s reload
[root@nginx2 conf.d]# curl var.example.org/test2/index.html
/data/web/html/test2/index.html is not exist

#如果文件存在就显示内容

set设置

已经在自定义变量中设置过了

break中断

location里面遇到break就不再执行它下面的动作了

[root@nginx2 conf.d]# vim var.conf 
#break
    location /break {
        default_type text/html;
        set $name lee;
        echo $name;
        if ( $http_user_agent = "curl/7.76.1" ){
            break;
        }
        set $id 666;
        echo $id;
    }
[root@nginx2 conf.d]# nginx -s reload
[root@nginx2 conf.d]# curl var.example.org/break
lee

[root@nginx2 conf.d]# curl -A "firefox" var.example.org/break
lee
666

return返回

[root@nginx2 conf.d]# vim var.conf 
#return

   location /return {
        default_type text/html;
        #如果文件不存在,就重定向到百度
        if ( !-e $request_filename){
            return 301 http://www.baidu.com;
        }
        echo "$request_filename is exist";
    }
#不存在
[root@nginx2 conf.d]# curl -I var.example.org/return
HTTP/1.1 301 Moved Permanently
Server: example/1.26.1
Date: Sun, 18 Aug 2024 06:04:49 GMT
Content-Type: text/html
Content-Length: 171
Connection: keep-alive
Location: http://www.baidu.com

#存在
[root@nginx2 conf.d]# mkdir  -p /data/web/html/return
[root@nginx2 conf.d]# curl -I var.example.org/return
HTTP/1.1 200 OK
Server: example/1.26.1
Date: Sun, 18 Aug 2024 06:08:39 GMT
Content-Type: text/html
Connection: keep-alive

Rewrite指令

临时域名和永久重定向

[root@nginx conf.d]# vim vhost.conf 
server {
    listen 80;
    server_name var.example.org;
    root /data/web/html;
    index index.html;

    location / {
        root /data/web/var;
        index index.html;
        rewrite / http://www.example.com permanent;     
        #rewrite / http://www.example.com redirect;
    }
}
[root@nginx conf.d]# mkdir /data/web/var -p
[root@nginx nginx]# curl var.example.org
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

last和break

break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写

last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

[root@nginx-node1 conf.d]# mkdir  /data/web/html/{test1,test2,break,last} -p
[root@nginx-node1 conf.d]# echo test1 > /data/web/html/test1/index.html
[root@nginx-node1 conf.d]# echo test2 > /data/web/html/test2/index.html
[root@nginx-node1 conf.d]# echo last > /data/web/html/last/index.html
[root@nginx-node1 conf.d]# echo break > /data/web/html/break/index.html

要点:

break访问得到的是test1,他不会继续读location之外的内容

last会读location之外的内容,它会读到test1然后重定向返回值

全站加密

#创建加密目录
[root@nginx ~]# cd /usr/local/nginx/
[root@nginx nginx]# mkdir certs

#加密
[root@nginx ~]# openssl req  -newkey  rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/example.org.key  -x509  -days 365 -out /usr/local/nginx/certs/example.org.crt

[root@nginx2 certs]# vim /usr/local/nginx/conf.d/vhost.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    #证书目录
    ssl_certificate /usr/local/nginx/certs/example.org.crt;
    #钥匙证书
    ssl_certificate_key /usr/local/nginx/certs/example.org.key;
    #session会话
    ssl_session_cache    shared:SSL:1m;
    #连接时间
    ssl_session_timeout  5m;

    location / {
    	#如果协议不是http,就重定向https
        if ( $scheme = http ){
            rewrite / https://$host redirect;
        }
        #如果访问的页面不存在,转到主页面
        if ( !-e $request_filename ){
            rewrite /(.*) https://$host/index.html redirect;
        }
    }
}

防盗链

原本网页

[root@nginx ~]# cd /data/web/html/images
[root@nginx images]# ls
xixi.jpg

盗链网页172.25.254.10

[root@webserver1 ~]# cd /var/www/html/
[root@webserver1 html]# vim index.html
<html>
  <head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>盗链</title>
</head>
  <body>
    <img src="http://www.example.org/images/xixi.jpg" >
    <h1 style="color:red">欢迎大家</h1>
    <p><a href=http://www.example.org>狂点老李</a>出门见喜</p>
  </body>
</html>
[root@webserver1 html]# systemctl restart httpd

访问盗链网页

防盗链

server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org;
    root /data/web/html;
    index index.html;
    ssl_certificate /usr/local/nginx/certs/example.org.crt;
    ssl_certificate_key /usr/local/nginx/certs/example.org.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    #允许访问的
    location /images  {
        valid_referers none blocked server_names *.example.org ~/.baidu/.;
        #如果是非法的,就重定向
        if ( $invalid_referer ){
                rewrite ^/   http://www.example.org/haha.jpg;
        }
     }
}

nginx方向代理功能

RS10

[root@webserver1 ~]# echo 172.25.254.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl restart httpd
​

RS20

[root@webserver2 ~]# mkdir -p /var/www/html/static
[root@webserver2 ~]# echo 172.25.254.20 > /var/www/html/static/index.html
[root@webserver2 ~]# vim /etc/httpd/conf/httpd.conf
listen 8080;

开始构建代理

[root@nginx2 conf.d]# vim vhost.conf
server {
    listen 80;
    server_name www.example.org;
​
    location / {
        proxy_pass http://172.25.254.10:80;
    }
​
    location /static {
        proxy_pass http://172.25.254.20:8080;
​
    }
}
[root@nginx2 conf.d]# nginx -s reload

测试结果

动静分离

10部署php

[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# vim /var/www/html/index.php
<?php
  phpinfo();
?>
[root@webserver1 ~]# systemctl restart httpd

nginx主机

server {
    listen 80;
    server_name www.example.org;
​
    location ~ \.php$ {
        proxy_pass http://172.25.254.10:80;
    }
​
    location /static {
        proxy_pass http://172.25.254.20:8080;
​
    }
}
​

测试

缓存功能

缓存功能默认关闭状态,需要先动配置才能启用

proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;

proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中

示例:
#缓存200 302 缓存10分钟
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

#示例:在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
levels=1:2:2 #定义缓存目录结构层次
#1:2:2可以生成
2^4x2^8x2^8=2^20=1048576个目录
keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata
inactive=120s #缓存有效时间
max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

非缓存场景

[root@webserver1 ~]# ab -n1000 -c100 http://www.example.org/static/index.html
Requests per second:    400.02 [#/sec] (mean)

Requests per second:    709.67 [#/sec] (mean)
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
    #gzip  on;
    include "/usr/local/nginx/conf.d/*.conf";
    proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g;
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
    listen 80;
    server_name www.example.org;

    location ~ \.php$ {
        proxy_pass http://172.25.254.10:80;
    }

    location /static {
        proxy_pass http://172.25.254.20:8080;
        proxy_cache proxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 10m;
        proxy_cache_valid any 1m;
    }
}
[root@nginx ~]# nginx -s reload
[root@webserver1 ~]# ab -n1000 -c100 http://www.example.org/static/index.html
Requests per second:    400.02 [#/sec] (mean)

Requests per second:    709.67 [#/sec] (mean)

反向代理负载均衡

#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检
测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性
检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再
次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down #标记为down状态,可以平滑下线后端服务器
6.1.2.2 反向代理示例: 后端多台 web服务器
环境说明:
部署后端 Apache服务器
配置 nginx 反向代理
注意: 本节实验过程中先关闭缓存
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算

hash $request_uri consistent; #基于用户请求的uri做hash

hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持

least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
upstream webcluster {
    ip_hash;
    #hash $request_uri consistent;
    #hash $cookie_lee;
    server 172.25.254.20:8080 weight=1 fail_timeout=15s max_fails=3;
    server 172.25.254.10:80 weight=1 fail_timeout=15s max_fails=3;
    #指定算法之后不能加backup
}
server {
    listen 80;
    server_name www.example.org;
    location / {
        proxy_pass http://webcluster;
    }
}
[root@nginx ~]# nginx -s reload

方向代理示例

使用的NAT网络,都使用的172.25.254.2去访问

hash $request_uri consistent测试结果

实现nginx四层负载

域名解析

[root@webserver1 ~]# dnf install bind -y

[root@webserver1 ~]# vim /etc/named.conf
#注释
options {
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
//      allow-query     { localhost; };

        dnssec-validation no;

#增加example的域名解析
[root@webserver1 ~]# vim /etc/named.rfc1912.zones
zone "example.org" IN {
        type master;
        file "example.org.zone";
        allow-update { none; };
};

#编译配置文件
[root@webserver1 ~]# cd /var/named/
[root@webserver1 named]# cp named.localhost example.org.zone -p
[root@webserver1 named]# vim example.org.zone 
$TTL 1D
@       IN SOA   ns.example.org. root.example.org. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.example.org.
ns      A       172.25.254.10
www     A       172.25.254.10
[root@webserver1 named]# systemctl restart named
[root@webserver1 named]# dig www.example.org @172.25.254.10
;; QUESTION SECTION:
;www.example.org.		IN	A

;; ANSWER SECTION:
www.example.org.	86400	IN	A	172.25.254.10


#复制到webserver2
[root@webserver1 named]# scp -p /etc/named.{conf,rfc1912.zones} root@172.25.254.20:/etc/
[root@webserver1 named]# scp -p /var/named/example.org.zone root@172.25.254.20://var/named/example.org.zone

FastCGI

源码安装php

#解压
[root@nginx ~]#  tar zxf php-8.3.9.tar.bz2
#编译目录
[root@nginx ~]# ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd 

#下载依赖
[root@Nginx ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel
libpng-devel libcurl-devel oniguruma-devel
[root@nginx php-8.3.9]# dnf list oniguruma
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Last metadata expiration check: 13:50:15 ago on Sun 18 Aug 2024 09:03:16 PM CST.
Installed Packages
oniguruma.x86_64                6.9.6-1.el9.5                @AppStream
Available Packages
oniguruma.i686                  6.9.6-1.el9.5                rhel9A   

#oniguruma-devel软件包安装失败,需要使用阿里云上的
[root@nginx-node1 php-8.3.9]# cd /usr/local/php/etc/
[root@nginx-node1 etc]# ls
php-fpm.conf.default  php-fpm.d

[root@nginx-node1 etc]# cp -p php-fpm.conf.default php-fpm.conf
[root@nginx-node1 etc]# ls
php-fpm.conf  php-fpm.conf.default  php-fpm.d
[root@nginx-node1 etc]# vim php-fpm.conf
#去掉注释
pid = run/php-fpm.pid #指定pid文件存放位置

[root@nginx-node1 etc]# cd php-fpm.d/
[root@nginx-node1 php-fpm.d]# ls
www.conf.default
[root@nginx-node1 php-fpm.d]# cp -p www.conf.default www.conf


[root@nginx-node1 etc]# cd /root/php-8.3.9/
[root@nginx-node1 php-8.3.9]# ls
[root@nginx-node1 php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@nginx-node1 php-8.3.9]# vim /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai #修改时区


[root@nginx-node1 php-8.3.9]# cd sapi/
[root@nginx-node1 sapi]# cd fpm/
[root@nginx-node1 fpm]# cp php-fpm.service /lib/systemd/system/
[root@nginx-node1 fpm]# vim /lib/systemd/system/php-fpm.service
#ProtectSystem=full #注释该内容


[root@nginx-node1 fpm]# systemctl start php-fpm.service
[root@nginx-node1 fpm]# systemctl daemon-reload 
[root@nginx-node1 fpm]# systemctl start php-fpm
[root@nginx-node1 fpm]# netstat -antlupe | grep php
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      0          126634     156497/php-fpm: mas 




[root@nginx-node1 fpm]# mkdir -p /data/web/php
[root@nginx-node1 fpm]# cd /usr/local/php/bin/
[root@nginx-node1 bin]# ls
phar  phar.phar  php  php-cgi  php-config  phpdbg  phpize
[root@nginx-node1 bin]# vim ~/.bash_profile 
[root@nginx-node1 bin]# cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin
[root@nginx-node1 bin]# source ~/.bash_profile 
[root@nginx-node1 bin]# php
php         php-cgi     php-config  phpdbg      php-fpm     phpize
[root@nginx-node1 bin]# vim /data/web/php/index.php
<?php
  phpinfo();
?>


[root@nginx-node1 bin]# cd /usr/local/
[root@nginx-node1 local]# cd nginx/
[root@nginx-node1 nginx]# cd conf/
[root@nginx-node1 conf]# ls
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@nginx-node1 conf]# vim fastcgi.conf
[root@nginx-node1 conf]# cd ..
[root@nginx-node1 nginx]# mkdir conf.d
[root@nginx-node1 nginx]# vim conf/nginx.conf
    include "/usr/local/nginx/conf.d/*.conf";
    
[root@nginx-node1 conf.d]# nginx -s reload
[root@nginx-node1 conf.d]# 
[root@nginx-node1 conf.d]# vim /usr/local/php/etc/php-fpm.d/www.conf
[root@nginx php-fpm.d]# vim www.conf
; Note: This value is mandatory.
listen = 0.0.0.0:9000

[root@nginx-node1 conf.d]# systemctl restart php-fpm.service 
[root@nginx-node1 conf.d]# netstat -antlupe | grep php
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      0          128283     156715/php-fpm: mas 

[root@nginx-node1 conf.d]# cd /usr/local/nginx/conf.d/
[root@nginx-node1 conf.d]# vim vhosts.conf 
[root@nginx-node1 conf.d]# cat vhosts.conf 
server {
	listen 80;
	server_name www.test.org;
	root /data/web/html;
	index index.html;
	
	location ~ \.php$ {
		root /data/web/php;
		fastcgi_pass 172.25.254.100:9000;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}
[root@nginx-node1 conf.d]# nginx -s reload

安装memcache

<---
[root@nginx-node1 ~]# cd /usr/local/php/
[root@nginx-node1 php]# ls
bin  etc  include  lib  php  sbin  var
[root@nginx-node1 php]# cd etc/
[root@nginx-node1 etc]# ls
php-fpm.conf  php-fpm.conf.default  php-fpm.d  php.ini
[root@nginx-node1 etc]# cp php.ini ../lib/
[root@nginx-node1 etc]# cd ../lib/
[root@nginx-node1 lib]# ls
php  php.ini
--->

#以上操作是因为以下没有指定配置路径,所以需要移动位置:
#解压源码并安装
[root@Nginx ~]# ./configure \
...
--with-config-file-path=/usr/local/php/etc \ #指定配置路径
...
[root@nginx-node1 ~]# ls
anaconda-ks.cfg                nginx-1.26.1
echo-nginx-module-0.63         nginx-1.26.1.tar.gz
echo-nginx-module-0.63.tar.gz  php-8.3.9
memcache-8.2.tgz               php-8.3.9.tar.gz
memc-nginx-module-0.20         srcache-nginx-module-0.33
memc-nginx-module-0.20.tar.gz  srcache-nginx-module-0.33.tar.gz
nginx-1.24.0                   testfile
nginx-1.24.0.tar.gz            testfile.1
[root@nginx-node1 ~]# tar zxf memcache-8.2.tgz 
[root@nginx-node1 ~]# ls
anaconda-ks.cfg                nginx-1.26.1
echo-nginx-module-0.63         nginx-1.26.1.tar.gz
echo-nginx-module-0.63.tar.gz  package.xml
memcache-8.2                   php-8.3.9
memcache-8.2.tgz               php-8.3.9.tar.gz
memc-nginx-module-0.20         srcache-nginx-module-0.33
memc-nginx-module-0.20.tar.gz  srcache-nginx-module-0.33.tar.gz
nginx-1.24.0                   testfile
nginx-1.24.0.tar.gz            testfile.1
[root@nginx-node1 ~]# cd memcache-8.2/
[root@nginx-node1 memcache-8.2]# ls
config9.m4  config.w32  docker      example.php  memcache.php  src
config.m4   CREDITS     Dockerfile  LICENSE      README        tests
[root@nginx-node1 memcache-8.2]# phpize
Configuring for:
PHP Api Version:         20230831
Zend Module Api No:      20230831
Zend Extension Api No:   420230831
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

[root@nginx-node1 memcache-8.2]# dnf install autoconf -y
[root@nginx-node1 memcache-8.2]# phpize
Configuring for:
PHP Api Version:         20230831
Zend Module Api No:      20230831
Zend Extension Api No:   420230831
[root@nginx-node1 memcache-8.2]# ./configure && make && make install


[root@nginx-node1 memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/
memcache.so  opcache.so
[root@nginx-node1 memcache-8.2]# 
[root@nginx-node1 memcache-8.2]# vim /usr/local/php/etc/php.ini
[root@nginx-node1 memcache-8.2]# systemctl restart php-fpm.service 
[root@nginx-node1 memcache-8.2]# dnf install memcached -y



[root@nginx-node1 memcache-8.2]# vim /etc/sysconfig/memcached
[root@nginx-node1 memcache-8.2]# systemctl start memcached.service 
[root@nginx-node1 memcache-8.2]# netstat -antlupe | grep memcache
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      991        140132     163074/memcached    
tcp6       0      0 ::1:11211               :::*                    LISTEN      991        140133     163074/memcached    
[root@nginx-node1 memcache-8.2]# php -m
[root@nginx-node1 memcache-8.2]# systemctl restart php-fpm.service 
[root@nginx-node1 memcache-8.2]# systemctl restart memcached.service 
[root@nginx-node1 memcache-8.2]# php -m



[root@nginx-node1 memcache-8.2]# cp example.php memcache.php /data/web/php/
[root@nginx-node1 memcache-8.2]# cd /data/web/php/
[root@nginx-node1 php]# ls
example.php  index.php  memcache.php
[root@nginx-node1 php]# vim memcache.php 
[root@nginx-node1 php]# systemctl restart php-fpm.service 
[root@nginx-node1 php]# systemctl restart memcached.service 



#测试对比:
[root@nginx-node1 php]# ab -n1000 -c10 http://www.test.org/index.php
[root@nginx-node1 php]# ab -n1000 -c10 http://www.test.org/index.php

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值