当前位置: 首页 > news >正文

企业高性能web服务器Nginx的详细部署(实战篇)

一.Nginx 安装

1.Nginx版本和安装方式

Nginx版本

Mainline version 主要开发版本,一般为奇数版本号,比如1.19 .  Stable version 当前最新稳定版,一般为偶数版本,:1.20

Legacy versions 旧的稳定版,一般为偶数版本,:1.18

Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装

   yum的版本比较旧

  编译安装可以更方便自定义相关路径

  使用源码编译可以自定义相关功能,更方便业务的上的使用

1.1.Nginx 编译安装

编译器介绍

源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU发,并以 GPLLGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C

言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,FortranpascalobjectiveDC java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块 需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)

等。

1.2. 编译安装 Nginx

官方源码包下载地址:

nginx: download

[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y

[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz

[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

[root@Nginx nginx]# cd nginx-1.24.0/

[root@Nginx nginx-1.24.0]# ls

auto CHANGES.ru configure html Makefile objs src

CHANGES conf contrib LICENSE man README

[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \

--user=nginx \ # 指定nginx运行用户

--group=nginx \ # 指定nginx运行组

--with-http_ssl_module \ # 支持https://

--with-http_v2_module \ # 支持http版本2

--with-http_realip_module \ # 支持ip透传

--with-http_stub_status_module \ # 支持状态页面

--with-http_gzip_static_module \ # 支持压缩

--with-pcre \ # 支持正则

--with-stream \ # 支持tcp反向代理

--with-stream_ssl_module \ # 支持tcpssl加密

--with-stream_realip_module # 支持tcp的透传ip

[root@Nginx nginx-1.24.0]# make && make install

2.启动nginx

1.上传nginx解压文档

2.验证版本信息

[root@Nginx ~]# vim ~/.bash_profile

export PATH=$PATH:/usr/local/nginx/sbin

[root@Nginx ~]# nginx -V

3.nginx命令应用示例

vim /usr/local/nginx/conf/nginx.conf

4.nginx启动

vim /lib/systemd/system/nginx.service

3.平滑升级和回滚

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

流程图:

将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)

 master进程发送USR2信号

master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin

master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx 进程共同提供Web服务,当前新的请求仍然由旧Nginxworker进程进行处理,将新生成的master   程的PID存放至新生成的pid文件nginx.pid

向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止

向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件 

 如果发现升级有问题,可以回滚:向老master发送HUP,向新master发送QUIT

案例:

创建目录app并传输

mkdir /app/

解压缩

tar -xzvf nginx-1.24.0.tar.gz

安装gcc依赖工具包

yum install gcc pcre-devel zlib-devel -y

查看版本信息

nginx -V

5.进入到 /app/nginx-1.24.0这个目录下 进行编译安装 


要进行平滑的升级的话就要粘贴好老版本的配置 

如下:

-prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
 

成功后会出现如下界面 

然后使用make进行编译安装为二级制

进入/usr/sbin/目录 将原来的nginx 改为nginx.old,将/app/nginx-1.24.0/objs/nginx文件传输到/usr/sbin下

最后进行nginx -v 检查语法 

nginx -V 最后的版本如果也是下载的高版本 说明平滑升级完成 

二.Nginx 核心配置详解

1.配置文件说明

nginx 官方帮助文档: nginx documentation Nginx的配置文件的组成部分:

主配置文件: nginx.conf

子配置文件: include conf.d/*.conf

fastcgi uwsgi scgi 等协议相关的配置文件

mime.types:支持的mime类型, MIME(Multipurpose Internet Mail Extensions)多用途互联网邮 

  件扩展类型, MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某   

  种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 

  使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

nginx 配置文件格式说明

配置文件由指令与指令块构成

每条指令以;分号结尾,指令与值之间以空格符号分隔

可以将多条指令放在同一行 ,用分号分隔即可 ,但可读性差 ,不推荐 指令块以{ }大括号将多条指令组织在一起 ,且可以嵌套指令块

include语句允许组合多个配置文件以提升可维护性

使用#符号添加注释,提高可读性

使用$符号使用变量

部分指令的参数支持正则表达式

Nginx 主配置文件的配置指令方式:

directive value [value2 ...];

注意

(1) 指令必须以分号结尾

(2) 支持使用配置变量

内建变量:由Nginx模块引入,可直接引用

自定义变量:由用户使用set命令定义 ,格式: set variable_name value;

引用变量:$variable_name

主配置文件结构:四部分

main block:主配置段,即全局配置段,对http,mail都有效

#事件驱动相关的配置 event {

...

}

#http/https 协议相关配置段 http {

....

}

#默认配置文件不包括下面两个块

#mail 协议相关配置段 mail {

...

}

#stream 服务器相关配置段 stream {

...

}

默认的nginx.conf 配置文件格式说明

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,NginxPID 径, 日志路径等。

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模块

server 可以使用一个端口比如都使用

listen       80;

#长连接超时时间,单位是秒

#设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多

#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个

#80端口提供web服务

#配置server监听的端口

2. 全局配置

Main 全局配置段常见的配置指令分类 

正常运行必备的配置

  优化性能相关的配置

   用于调试及定位问题相关的配置

   事件驱动相关的配置

全局配置说明:

user nginx nginx;       #启动Nginx工作进程的用户和组

worker_processes [number | auto]; #启动Nginx工作进程的数量 ,一般设为和CPU核心数相同

worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;

#Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx 程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的  cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务 器的性能。

CPU MASK:   000000010CPU

000000101CPU

100000007CPU

#示例

worker_cpu_affinity 0001 0010 0100 1000;0---3CPU

worker_cpu_affinity 0101 1010;

#示例

worker_processes  4;

worker_cpu_affinity 00000010 00001000 00100000 10000000;

[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx

31093 nginx: master process /apps   1

34474 nginx: worker process         1

34475 nginx: worker process         3

34476 nginx: worker process         5

34477 nginx: worker process         7

#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit | alert | emerg]

#error_log logs/error.log;

#error_log logs/error.log notice;

error_log /usr/local/nginx/logs/error.log error;

#pid文件保存路径

pid       /usr/local/nginx/logs/nginx.pid;

worker_priority 0;      #工作进程优先级,-20~20(19)

worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限 ,

#包括:Nginx的所有连接(例如与代理服务器的连接等)

#而不仅仅是与客户端的连接

#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件 数的限制

#最好与ulimit -n 或者limits.conf的值保持一致 ,

#修改pam限制

[root@Nginx ~]# sudo -u nginx  ulimit -n 1024

[root@Nginx ~]# vim /etc/security/limits.conf

*               -       nofile          100000 [root@Nginx ~]# sudo -u nginx  ulimit -n

100000

daemon off;             #前台运行Nginx服务用于测试、docker等环境。

master_process off|on;  #是否开启Nginxmaster-worker工作模式,仅用于开发调试场景 ,默认为 on

events {

高并发配置

[root@Nginx ~]# ulimit -n 102400

[root@Nginx ~]# ab -c 5000 -n 10000 http://10.0.0.8/

修改配置

vim /etc/security/limits.conf

*   - nproc 100000
[root@Nginx ~]# vim /apps/nginx/conf/nginx.conf worker_rlimit_nofile 100000;
[root@Nginx ~]# systemctl restart nginx

重启nginx

3. http 配置块

#在响应报文中将指定的文件扩展名映射至MIME对应的类型

include           /etc/nginx/mime.types;

default_type     application/octet-stream;          #mime.types中的类型外

#指定其它文件的默认MIME类型,浏览

器一般会提示下载

types {

text/html html;

image/gif gif;

image/jpeg jpg; }

4. 核心配置示例

基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。

#定义子配置文件路径

[root@Nginx ~]# mkdir  /usr/local/nginx/conf.d/

[root@centos8 ~]# vim /usr/local/nginx/conf/nginx.conf http {

......

include /apps/nginx/conf/conf.d/*.conf;     #在配置文件的最后面添加此行

#注意不要放在最前面 ,会导致前面的命令无法

生效

}

#创建虚拟主机网站配置

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf server {

listen 80;

server_name lee.timinglee.org;

location / {

root /webdata/nginx/timinglee.org/lee/html;

}

}

[root@Nginx ~]# mkdir  -p /webdata/nginx/timinglee.org/lee/html

[root@Nginx ~]# echo lee.timinglee.org >

/webdata/nginx/timinglee.org/lee/html/index.html [root@Nginx ~]# nginx -s reload

#访问测试

[root@node100 ~]# curl  lee.timinglee.org           #注意在访问主机中设解析

lee.timinglee.org

root alias

root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location

root示例

server {

listen 80;

server_name lee.timinglee.org;

location / {

root /webdata/nginx/timinglee.org/lee/html; }

location /dirtest {             #必须建立/mnt/dirtest才能访问

root /mnt; }

}

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于

location上下文,此指令使用较少

 alias示例:

server {

listen 80;

server_name lee.timinglee.org;

location / {

root /webdata/nginx/timinglee.org/lee/html; }

location /dirtest {             #必须建立/mnt/dirtest才能访问

root /mnt; }

}

注意:

location中使用root指令和alias指令的意义不同

root

#给定的路径对应于location中的/uri左侧的/

alias

#给定的路径对应于location中的/uri的完整路径

 location 的详细使用

.  在一个serverlocation配置段可存在多个,用于实现从uri到文件系统的路径映射;

.  ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,

.  而后应用其配置在没有使用正则表达式的时候,  nginx会先在server中的多个location选取匹配度最 高的一个uri

.  uri是用户请求的字符串,即域名后面的web件路径

.  然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理 此请求。

#语法规则:

location [ = | ~ | ~* | ^~ ] uri { ... }

=           #用于标准uri前,需要请求字串与uri精确匹配,大小敏感 ,如果匹配成功就停止向下匹配并立

即处理请求

^~          #用于标准uri前,表示包含正则表达式 ,并且匹配以指定的正则表达式开头

#uri的最左边部分做匹配检查,不区分字符大小写

~           #用于标准uri前,表示包含正则表达式 ,并且区分大小写

~*          #用于标准uri前,表示包含正则表达式 ,并且不区分大写

不带符号       #匹配起始于此uri的所有的uri

\            #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:

=, ^~, ~/~*, 不带符号

Nginx账户认证功能

由 ngx_http_auth_basic_module 模块提供此功能

[root@Nginx ~]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin lee   #-b 表示非交互建立用户认证
Adding password for user admin
[root@Nginx ~]# htpasswd -mb /usr/local/nginx/conf/.htpasswd lee lee
Adding password for user lee
[root@Nginx ~]# cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$haGCKgCT$myogggALmqNecTyNupsWQ/
lee:$apr1$H97AyQPF$kGU.Tc4zn1E4Zkp/M4R6G.
[root@Nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/login
[root@Nginx ~]# echo login > /webdata/nginx/timinglee.org/lee/login/index.html
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {listen 80;server_name lee.timinglee.org;location /login {root /webdata/nginx/timinglee.org/lee;index index.html;auth_basic "login password";auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";}
}
#重启Nginx并访问测试
[root@node100 ~]# curl lee.timinglee.org/login/ -u lee:lee
login
[root@node100 ~]# curl lee.timinglee.org/login/ -u admin:lee
login

自定义错误页面

http, server, location, if in location

[root@Nginx ~]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin lee   #-b 表示非交互建立用户认证
Adding password for user admin
[root@Nginx ~]# htpasswd -mb /usr/local/nginx/conf/.htpasswd lee lee
Adding password for user lee
[root@Nginx ~]# cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$haGCKgCT$myogggALmqNecTyNupsWQ/
lee:$apr1$H97AyQPF$kGU.Tc4zn1E4Zkp/M4R6G.
[root@Nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/login
[root@Nginx ~]# echo login > /webdata/nginx/timinglee.org/lee/login/index.html
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
 server {
       listen 80;
       server_name lee.timinglee.org;
       location /login {
           root /webdata/nginx/timinglee.org/lee;
           index index.html;
           auth_basic "login password";
           auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
       }
}
#重启Nginx并访问测试
[root@node100 ~]# curl lee.timinglee.org/login/ -u lee:lee
login
[root@node100 ~]# curl lee.timinglee.org/login/ -u admin:lee
login

自定义错误日志

[root@Nginx ~]# mkdir "/var/log/nginx" -p
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
   listen 80;
   server_name lee.timinglee.org;
   error_page 404 /40x.html;
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;
   location = /40x.html {
       root /webdata/nginx/timinglee/lee/errors;
   }

#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件

检查文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内 部500错误。

[root@Nginx ~]# echo "index.html is not exist" > 
/webdata/nginx/timinglee.org/lee/error/default.html
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
   listen 80;
   server_name lee.timinglee.org;
   root /webdata/nginx/timinglee.org/lee;
   error_page 404 /40x.html;
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;
   try_files $uri $uri.html $uri/index.html /error/default.html;
   location = /40x.html {
       root /webdata/nginx/timinglee/lee/errors;
   }
}

作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,生成目录列表,可作为下载服务 配置使用。

autoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off;  #计算文件确切大小(单位bytes),off 显示大概大小(单位K、
M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位
B/s,bytes/second, #默认值0,表示无限制,此指令由
ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.

#注意:download不需要index.html文件
[root@Nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/download
[root@Nginx ~]# cp /root/anaconda-ks.cfg 
/webdata/nginx/timinglee.org/lee/download
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
   listen 80;
   server_name lee.timinglee.org;
   root /webdata/nginx/timinglee.org/lee;
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;
   try_files $uri $uri.html $uri/index.html /error/default.html;
   location = /40x.html {
       root /webdata/nginx/timinglee/lee/errors;
   }
   location /download {
       autoindex on; #自动索引功能
       autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
        autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显
示GMT时间
       limit_rate 1024k; #限速,默认不限速   }
}
#重启Nginx并访问测试下载页面

生产使用案例

#直接匹配网站根会加速Nginx访问处理

location = /index.html { ......;

}

location / {

......;

}

#静态资源配置方法1

location ^~ /static/ { ......;

}

#静态资源配置方法2,应用较多

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { ......;

}

#多应用配置

location ~* /app1 {

......; }

location ~* /app2 {

......; }

三.Nginx高级配置

1.nginx状态页

基于nginx 模块 ngx_http_stub_status_module 实现

在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module 否则配置完成之后监测会是提示法错误

否则配置完成之后监测会是提示法错误

注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

#配置示例:
location /nginx_status {
  stub_status;
   auth_basic           "auth login";
   auth_basic_user_file /apps/nginx/conf/.htpasswd;
   allow 192.168.0.0/16;
   allow 127.0.0.1;
   deny all;
 }
#状态页用于输出nginx的基本状态信息:
#输出信息示例:
Active connections: 291
server accepts handled requests
 16630948 16630948 31070465
 上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: #当前处于活动状态的客户端连接数
 #包括连接等待空闲连接数=reading+writing+waiting
 
accepts: #统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
 #通常等于accepts,除非有因worker_connections限制等被拒绝的
连接
 
requests: #统计总值,Nginx自启动后客户端发来的总的请求数
Reading: #当前状态,正在读取客户端请求报文首部的连接的连接数
 #数值越大,说明排队现象严重,性能不足
 
Writing: #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明
访问量很大
Waiting: #当前状态,正在等待客户端发出请求的空闲连接数
 开启 keep-alive的情况下,这个值等于active – 
(reading+writing)

 2.Nginx版本隐藏


用户在访问nginx的时候,我们可以从报文中获得nginx的版本,相对于裸漏版本号的nginx,我们把其隐 藏起来更安全
 

[root@Nginx nginx-1.26.1]# vim src/core/nginx.h
#define nginx_version     1026001
#define NGINX_VERSION     "1.0"
#define NGINX_VER         "HAHA/" NGINX_VERSION

3.Nginx变量使用

nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用

变量可以分为内置变量和自定义变量

内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。

 内置变量

Alphabetical index of variables

常用内置变量:

$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验证的用户名
$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为任意请求报文首部字段,表示记录请求报文的首部字段,name的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
#示例: 
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@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name lee.timinglee.org;root /webdata/nginx/timinglee.org/lee;location /var {default_type text/html;echo $remote_addr;echo $args;echo $document_root;echo $document_uri;echo $host;echo $http_user_agent;echo $request_filename;echo $scheme;echo $scheme://$host$document_uri?$args;echo $http_cookie;echo $cookie_key2;echo $http_Accept;}
}

自定义变量

假如需要自定义变量名称和值,使用指令set $variable value; 

语法格式:

Syntax: set $variable value;

Default: —

Context: server, location, if

4.Nginx Rewrite相关功能

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求

此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE

rewritenginx服务器的重要功能之一,用于实现URL的重写, URL的重写是非常有用的功能

比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的 链接,就可以设置为访问

 另外还可以在一定程度上提高网站的安全性

ngx_http_rewrite_module 模块指令

官方文档: Module ngx_http_rewrite_module

1.if指令

官方文档:

Module ngx_http_rewrite_module

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断。

if (条件匹配) { action

}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间 使用以下符号链接:

=       #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false

!=      #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false

~       #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假

!~      #区分大小写字符 ,判断是否匹配,不满足匹配条件为真,满足匹配条件为假

~*      #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假

!~*     #不区分大小字符 ,判断是否匹配,满足匹配条件为假,不满足匹配条件为真

-f  !-f        #判断请求的文件是否存在和是否不存在

-d  !-d        #判断请求的目录是否存在和是否不存在

-x  !-x        #判断文件是否可执行和是否不可执行

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

#注意:

#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true

#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

示例:

location /test {
   index index.html;
   default_type text/html;
   if ( $scheme = http ){
     echo "if ---------> $scheme";
   }
   if ( $scheme = https ){
     echo "if ---------> $scheme";
   }
 }
 location /test2 {
   if ( !-e $request_filename ){
       echo "$request_filename is not exist";
       return 409;
   }
 }
测试:
[root@client ~]# curl lee.timinglee.org/test/
if ---------> http
[root@client ~]# curl lee.timinglee.org/test2/test
/webdata/nginx/timinglee.org/lee/test2/test is not exist

2.set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key

另外set定义格式为set $key value value可以是text, variables和两者的组合。        

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee; location /test3{
set $name lee;
echo $name; }
}测试:
[root@client ~]# curl  lee.timinglee.org/test3
lee

3.break 指令

用于中断当前相同作用域(location)中的其他Nginx配置

与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行

Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf

server {

listen 80;

server_name lee.timinglee.org;

root /webdata/nginx/timinglee.org/lee; location /break{

default_type text/html;

set $name lee;

echo $name;

break;

set $port $server_port;

echo $port; }

}

[root@client ~]# curl  lee.timinglee.org/break          #当未添加break

lee

80

[root@client ~]# curl  lee.timinglee.org/break          #添加break

lee

4.return 指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重  定向状态码, 301/302) 或者是指定提示文本内容(对于特殊状态码403/500),处于此指令后的所有配

置都将不被执行, return可以在server if location块进行配置 

语法格式:

return code;        #返回给客户端指定的HTTP状态码

return code [text]; #返回给客户端的状态码及响应报文的实体内容

#可以调用变量 ,其中text如果有空格 ,需要用单或双引号

return code URL;    #返回给客户端的URL地址

示例:

server {

listen 80;

server_name lee.timinglee.org;

root /webdata/nginx/timinglee.org/lee; location /return {

default_type text/html;

if ( !-e $request_filename){

return 301 百度一下,你就知道;

#return 666 "$request_filename is not exist"; }

echo "$request_filename is exist"; }

}

测试:

[root@client ~]# curl lee.timinglee.org/return

/webdata/nginx/timinglee.org/lee/return is exist

[root@client ~]# curl lee.timinglee.org/return1

/webdata/nginx/timinglee.org/lee/return1 is not exist

#测试return 301 百度一下,你就知道;

可在浏览器直接访问lee.timinglee.org/return1

return示例:

location /test {

default_type application/json;

return 200 '{"status:"success"}'; }

5. rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,

rewrite主要是针对用户请求的URL或者是URI做具体处理 官方文档:

Module ngx_http_rewrite_module

语法格式 :

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检;被某条件规则替换完成     后,会重新一轮的替换检查,隐含有循环机制,但不超过10;如果超过,提示500响应码, [flag]所表示的 标志位用于控制此循环机制

如果替换后的URL是以http://https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

正则表达式格式

.       #匹配除换行符以外的任意字符

\w      #匹配字母或数字或下划线或汉字

\s      #匹配任意的空白符

\d      #匹配数字

\b      #匹配单词的开始或结束

^       #匹配字付串的开始

$       #匹配字符串的结束

*       #匹配重复零次或更多次 +       #匹配重复一次或更多次 ?       #匹配重复零次或一次

(n)     #匹配重复n

{n,}    #匹配重复n次或更多次

{n,m}   #匹配重复nm

*?      #匹配重复任意次,但尽可能少重复

+?      #匹配重复1次或更多次,但尽可能少重复

??      #匹配重复0次或1次,但尽可能少重复

{n,m}?  #匹配重复nm次,但尽可能少重复

{n,}?   #匹配重复n次以上,但尽可能少重复

\W      #匹配任意不是字母,数字,下划线,汉字的字符

\S      #匹配任意不是空白符的字符

\D      #匹配任意非数字的字符

\B      #匹配不是单词开头或结束的位置

[^x]    #匹配除了x以外的任意字符

[^lee]  #匹配除了lee 这几个字母以外的任意字符

6.rewrite flag 使用介绍

利用nginxrewrite的指令,可以实现url的重新跳转, rewrite有四种不同的flag,分别是redirect(临时  重定向302) permanent(永久重定向301) breaklast。其中前两种是跳转型的flag,后两种是代理型

  跳转型指由客户端浏览器重新对新地址进行请求

  代理型是在WEB服务器内部实现跳转 rewrite 格式

rewrite 格式

Syntax: rewrite regex replacement [flag];   #通过正则表达式处理用户请求并返回替换后的数据 包。

Default: —

Context: server, location, if

flag说明

redirect;

#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端

#由客户端重新发起请求;使用相对路径,http://https://开头,状态码:302

permanent;

#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端

#由客户端重新发起请求,状态码:301

break;

#重写完成后 ,停止对当前URL在当前location中后续的其它重写操作

#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用

#适用于一个URL一次重写

last;

#重写完成后 ,停止对当前URI在当前location中后续的其它重写操作, #而后对新的URL启动新一轮重写检查,不建议location中使用

#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

7.break和last案例


break:用于中断当前相同作用域(location)中的其他 Nginx 配置 与该指令处于同一作用域的Nginx 配置中,位于它前面的配置生效 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行 Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server 块和 locationif 块中使用.
 

[root@nginx]# mkdir /data/web/html/{test1,test2,break,last}
[root@nginx]# echo test1 > /data/web/html/test1/index.html
[root@nginx]# echo test2 > /data/web/html/test2/index.html
[root@nginx]# echo last > /data/web/html/last/index.html
[root@nginx]# echo break > /data/web/html/break/index.html
[root@nginx nginx]# vim conf.d/vhosts.conf
server {listen 80;server_name www.timinglee.org;root /data/web/html;index index.html;location /break {root /data/web/html;rewrite ^/break/(.*) /test1/$1 break;rewrite ^/test1/(.*) /test2/$1 ;}location /last {root /data/web/html;rewrite ^/last/(.*) /test1/$1 last;rewrite ^/test1/(.*) /test2/$1 ;}location /test1 {default_type text/html;return 666 "new test1";}location /test2 {root /data/web/html;}
}
#测试:
[root@client ~]# curl -L www.timinglee.org/break/index.html
test1
[root@client ~]# curl -L www.timinglee.org/last/index.html
new test1

8.rewrite案例: 自动跳转 https

案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全 部自动跳转至 https,另外也可以实现部分 location 跳转

[root@centos8 ~]#vim /apps/nginx/conf.d/pc.conf server {

listen 443 ssl;

listen 80;

ssl_certificate /apps/nginx/certs/www.timinglee.org.crt;

ssl_certificate_key /apps/nginx/certs/www.timinglee.org.key; ssl_session_cache shared:sslcache:20m;

ssl_session_timeout 10m;

server_name www.timniglee.org;

location / {    #针对全站跳转

root /data/nginx/html/pc;

index index.html;

if ($scheme = http ){       #如果没有加条件判断,会导致死循环 rewrite / https://$host redirect;

}

}

location /login {           #针对特定的URL进行跳转https

if ($scheme = http ){       #如果没有加条件判断,会导致死循环 rewrite / https://$host/login redirect;

} }

}

#重启Nginx并访问测试

[root@centos7 ~]#curl -ikL www.timinglee.org HTTP/1.1 302 Moved Temporarily

Server: nginx/1.18.0

Date: Thu, 08 Oct 2020 15:23:48 GMT

Content-Type: text/html

Content-Length: 145

Connection: keep-alive

Location: https://www.timinglee.org HTTP/1.1 200 OK

Server: nginx/1.18.0

Date: Thu, 08 Oct 2020 15:23:48 GMT

Content-Type: text/html

Content-Length: 7

Last-Modified: Sat, 26 Sep 2020 01:18:32 GMT

Connection: keep-alive

ETag: "5f6e96e8-7"

Accept-Ranges: bytes pc web

5.Nginx 防盗链

防盗链基于客户端携带的referer实现, referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗   链, referer就是之前的那个网站域名,正常的referer信息有以下几种:

none:                  #请求报文首部没有referer首部,

#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。

blocked               #请求报文有referer首部,但无有效值,比如为空。

server_names:        #referer首部中包含本主机名及即nginx 监听的server_name

arbitrary_string:   #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org

www.timinglee.*

regular expression #被指定的正则表达式模式匹配到的字符串 ,要使用~开头,例如:

~.*\.timinglee\.com

盗链

准备一个web服务器(192.168.118.10),写入网站内容,在该站点盗取另一(192.168.118.100)
 

<html><head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><title>盗链</title>
</head><body><img src="http://www.timinglee.org/images/1.png" ><h1 style="color:red">欢迎大家</h1><p><a href=http://www.timinglee.org</a>出门见喜</p></body></html>

在192.168.118.100的服务器的images文件夹内上传图片1.png。

浏览器输入:http://192.168.118.10可以看到该站点自动连接到100服务器的信息

防盗链

基于访问安全考虑, nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效

实现防盗链功能 官方文档:

Module ngx_http_referer_module

在100服务器http的发布目录内上传盗链图片,意味着当其他站点盗链1.png时,会自动替换成盗链图片

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
   listen 80;
   server_name www.timinglee.org;
   root /data/web/html;
   index index.html;
   location / {
       valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;
        if ($invalid_referer){
           return 404;
       }
   }
   location /images {
       valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;
        if ($invalid_referer){
       rewrite ^/ http://www.timinglee.org/daolian.png permanent; #注意此图片不能和正常图片放在一个目录中
       }
   }
}
 
#重启Nginx并访问测试
http://192.168.118.10

四.Nginx 反向代理功能

反向代理: reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预   定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主 要在不同的场景使用以下模块实现不同的功能

ngx_http_proxy_module:      #将客户端的请求以http协议转发至指定服务器进行处理

ngx_http_upstream_module    #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass

#等指令引用的后端服务器分组

ngx_stream_proxy_module:    #将客户端的请求以tcp协议转发至指定服务器处理

ngx_http_fastcgi_module:    #将客户端对php的请求以fastcgi协议转发至指定服务器助理  ngx_http_uwsgi_module:      #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

逻辑调用关系:

访问逻辑图:

同构代理:用户不需要其他程序的参与,直接通http协议或者tcp协议访问后端服务器

异构代理:用户访问的资源时需要经过处理后才能返回的,比如php  python,等等,这种访问资源需 要经过处理才能被访问

1.指定location实现反向代理(动静分离)

环境:一台WEBSERVERIP为10和两台RSIP为100&200

在RS1上做静态

dnf install httpd -y

mkdir   /var/www/html/static/

echo 192.168.118.100 static > /var/www/html/static/index.html

在100上写入网站首页内容并修改端口为8080

在RS2上做动态
 

dnf install httpd -ydnf install php -ysystemctl  restart  httpdmkdir  /var/www/html/php/vim  /var/www/html/php/index.php
<?phpphpinfo();
?>

做访问全站代理,虽然要访问的是www.timinglee.org,但是给你返回的却是192.168.118.100的内容只要是PHP结尾的请求,返回的都是192.168.118.200的内容,其他的请求都是返回100的内容

参数介绍:
 
proxy_pass;
# 用来设置将客户端请求转发给的后端服务器的主机
# 可以是主机名 ( 将转发至后端服务做为主机头首部 ) 、 IP 地址:端口的方式
# 也可以代理到预先设置的主机群组,需要模块 ngx_http_upstream_module 支持
proxy_pass_header field;
# 透传
# 默认 nginx 在响应报文中不传递后端服务器的首部字段 Date, Server, X-Pad, X-Accel 等参数
# 如果要传递的话则要使用 proxy_pass_header field 声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
# 示例 : 透传后端服务器的 Server 和 Date 首部给客户端 , 同时不再响应报中显示前端服务器的 Server 字段
proxy_pass_header Server;
proxy_pass_header Date;
proxy_pass_request_body on | off;
# 是否向后端服务器发送 HTTP 实体部分 , 可以设置在 http,server 或 location 块,默认即为开启
proxy_pass_request_headers on | off;
# 是否将客户端的请求头部转发给后端服务器,可以设置在 http,server 或 location 块,默认即为开启
proxy_set_header;
# 可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实 IP 的
时候,就要更改每一个报文的头部
proxy_connect_timeout time;
# 配置 nginx 服务器与后端服务器尝试建立连接的超时时间,默认为 60 秒
用法如下: proxy_connect_timeout 6s;
#60s 为自定义 nginx 与后端服务器建立连接的超时时间 , 超时会返回客户端 504 响应码
proxy_read_timeout time;
# 配置 nginx 服务器向后端服务器或服务器组发起 read 请求后,等待的超时时间,默认 60s
proxy_send_timeout time;
# 配置 nginx 项后端服务器或服务器组发起 write 请求后,等待的超时 时间,默认 60s
proxy_http_version 1.0;
# 用于设置 nginx 提供代理服务的 HTTP 协议的版本,默认 http 1.0
proxy_ignore_client_abort off;
# 当客户端网络中断请求时, nginx 服务器中断其对后端服务器的请求。即如果此项设置为 on 开启,则服务器、
会忽略客户端中断并一直等着代理服务执行返回,如果设置为 off ,则客户端中断后 Nginx 也会中断客户端请求
并立即记录 499 日志,默认为 off 。

再次缓存资源,改善缓存速度

2.Nginx四层负载均衡


Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp 负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。

如果编译安装,需要指定 --with-stream 选项才能支持ngx_stream_proxy_module模块
 

tcp负载均衡配置参数

tcp的负载均衡要卸载http语句块之外

stream { #定义stream相关的服务;
Context:mainupstream backend { #定义后端服务器hash $remote_addr consistent; #定义调度算法server backend1.example.com:12345 weight=5; #定义具体serverserver 127.0.0.1:12345      max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;}upstream dns {   #定义后端服务器server 10.0.0.1:53;   #定义具体serverserver dns.example.com:53;}server { #定义serverlisten 12345; #监听IP:PORTproxy_connect_timeout 1s; #连接超时时间proxy_timeout 3s; #转发超时时间proxy_pass backend; #转发到具体服务器组}server {listen 127.0.0.1:53 udp reuseport;proxy_timeout 20s;proxy_pass dns;}server {listen [::1]:12345;proxy_pass unix:/tmp/stream.socket;}
}
负载均衡实例: DNS

在rs1和rs2上配置dns

vim /etc/named.conf

vim /etc/name.rfc1912.zones

cd        /var/named/
cp   -p        named.localhost        "timinglee.org.zone"
vim        "timinglee.org.zone"

systemctl restart named  #重启named

在RS2上也要做一样的操作(使用scp命令到192.168.118.200即可)

[root@RS1 named]# scp "timinglee.org.zone" root@192.168.118.200:/var/named/"timinglee.org.zone"
The authenticity of host '192.168.118.200 (192.168.118.200)' can't be established.
ED25519 key fingerprint is SHA256:IFxT3QjgJxWrenX499K2CZg1AsnVj2wAFb3xkQc00bo.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.118.200' (ED25519) to the list of known hosts.
root@192.168.118.200's password:
timinglee.org.zone        100% 189    209.7KB/s    00:00
[root@RS1 named]#

然后配置

在nginx配置如下信息:

在主配置文件中添四层代理的子配置目录

测试:

启动两台server的dns,查看是否解析成功

负载均衡实例: MySQL

后端服务器安装 MySQL

在RS1和RS2上都要:

yum install mariadb-server -yvim       /etc/my.cnf.d/mariadb-server.cnf[mysqld] server-id=100 #另一个主机写200systemctl start mariadb #启动服务mysql -e "grant all on *.* to lee@'%' identified by 'lee';"

安装并配置 MariaDB 主从复制

以下步骤展示了如何安装 MariaDB 并配置主从复制的基本流程。假设需要在两台主机上分别设置主服务器(server-id=100)和从服务器(server-id=200)。

安装 MariaDB 服务

执行以下命令安装 MariaDB 服务器:

yum install mariadb-server -y

配置主服务器

编辑 MariaDB 配置文件以设置主服务器标识:

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld] 部分添加以下内容:

[mysqld]
server-id=100
log-bin=mysql-bin
binlog-format=ROW

启动 MariaDB 服务

启动 MariaDB 服务并确保其开机自启:

systemctl start mariadb
systemctl enable mariadb

创建复制用户

在 MySQL 中创建用于复制的用户并授予权限:

mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'password';"
mysql -e "FLUSH PRIVILEGES;"

配置从服务器

在从服务器上编辑配置文件:

vim /etc/my.cnf.d/mariadb-server.cnf

添加以下内容:

[mysqld]
server-id=200
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1

启动从服务器服务

启动从服务器上的 MariaDB 服务:

systemctl start mariadb
systemctl enable mariadb

配置主从复制

在主服务器上获取二进制日志位置:

mysql -e "SHOW MASTER STATUS;"

记录 FilePosition 值,然后在从服务器上配置复制:

mysql -e "CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='recorded_file', MASTER_LOG_POS=recorded_position;"
mysql -e "START SLAVE;"

验证复制状态

检查从服务器的复制状态:

mysql -e "SHOW SLAVE STATUS\G"

确保 Slave_IO_RunningSlave_SQL_Running 都显示为 Yes

测试复制

在主服务器上创建测试数据库或表,验证从服务器是否同步了这些更改。

安全注意事项

为安全起见,建议:

  • 使用强密码替代示例中的 'password'

  • 限制复制用户的访问权限

  • 定期监控复制状态

这个配置提供了基本的 MariaDB 主从复制设置,可根据实际需求进一步调整参数。

安装并配置 MariaDB 主从复制

以下步骤展示了如何安装 MariaDB 并配置主从复制的基本流程。假设需要在两台主机上分别设置主服务器(server-id=100)和从服务器(server-id=200)。

安装 MariaDB 服务

执行以下命令安装 MariaDB 服务器:

yum install mariadb-server -y

配置主服务器

编辑 MariaDB 配置文件以设置主服务器标识:

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld] 部分添加以下内容:

[mysqld]
server-id=100
log-bin=mysql-bin
binlog-format=ROW

启动 MariaDB 服务

启动 MariaDB 服务并确保其开机自启:

systemctl start mariadb
systemctl enable mariadb

创建复制用户

在 MySQL 中创建用于复制的用户并授予权限:

mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'password';"
mysql -e "FLUSH PRIVILEGES;"

配置从服务器

在从服务器上编辑配置文件:

vim /etc/my.cnf.d/mariadb-server.cnf

添加以下内容:

[mysqld]
server-id=200
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1

启动从服务器服务

启动从服务器上的 MariaDB 服务:

systemctl start mariadb
systemctl enable mariadb

配置主从复制

在主服务器上获取二进制日志位置:

mysql -e "SHOW MASTER STATUS;"

记录 FilePosition 值,然后在从服务器上配置复制:

mysql -e "CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='recorded_file', MASTER_LOG_POS=recorded_position;"
mysql -e "START SLAVE;"

验证复制状态

检查从服务器的复制状态:

mysql -e "SHOW SLAVE STATUS\G"

确保 Slave_IO_RunningSlave_SQL_Running 都显示为 Yes

测试复制

在主服务器上创建测试数据库或表,验证从服务器是否同步了这些更改。

安全注意事项

为安全起见,建议:

  • 使用强密码替代示例中的 'password'

  • 限制复制用户的访问权限

  • 定期监控复制状态

这个配置提供了基本的 MariaDB 主从复制设置,可根据实际需求进一步调整参数。

nginx配置

[root@nginx ~]# vim /usr/local/nginx/tcpconf.d/dns.conf
stream {upstream mysql {server 192.168.118.10:3306  max_fails=3 fail_timeout=15s;server 192.168.118.20:3306  max_fails=3 fail_timeout=15s;}server {listen 3306;proxy_timeout 60s;proxy_pass mysql;}
}

典型问题排查

配置保存后执行nginx -t测试配置时出现语法错误
需确保Nginx编译时包含--with-stream模块,且主配置文件中包含include tcpconf.d/*.conf;指令。

客户端连接时出现connection refused
检查防火墙是否开放3306端口,使用命令:

firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

性能优化建议

增加缓冲控制参数
可在server块内添加:

proxy_buffer_size 16k;
proxy_buffers 4 32k;

启用SO_KEEPALIVE
添加配置保持长连接:

proxy_socket_keepalive on;

监控配置

建议在upstream块中添加状态监控端口:

server 192.168.118.10:3306 check port=9200 inter=2000 rise=2 fall=3;

需要配合nginx-module-vts等监控模块使用。

配置解析

该配置是一个Nginx的TCP/UDP负载均衡配置片段,用于将MySQL数据库请求分发到后端多个服务器。以下是关键配置项的说明:

max_fails=3 fail_timeout=15s
定义了服务器健康检查机制,当3次连接失败后标记为不可用,15秒后重新尝试恢复连接。

proxy_timeout 60s
设置代理连接超时时间为60秒,超过该时间没有数据传输则断开连接。

典型问题排查

配置保存后执行nginx -t测试配置时出现语法错误
需确保Nginx编译时包含--with-stream模块,且主配置文件中包含include tcpconf.d/*.conf;指令。

客户端连接时出现connection refused
检查防火墙是否开放3306端口,使用命令:

firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

性能优化建议

增加缓冲控制参数
可在server块内添加:

proxy_buffer_size 16k;
proxy_buffers 4 32k;

启用SO_KEEPALIVE
添加配置保持长连接:

proxy_socket_keepalive on;

监控配置

建议在upstream块中添加状态监控端口:

server 192.168.118.10:3306 check port=9200 inter=2000 rise=2 fall=3;

需要配合nginx-module-vts等监控模块使用。

在10上停止mysql服务
 
systemctl stop mariadb
 
#再次测试访问,只会看到mysql-server1.timinglee.org进行响应
 mysql -ulee -plee -h172.25.254.10 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
 

 停止 MySQL/MariaDB 服务的步骤

在 Linux 系统上停止 MySQL 或 MariaDB 服务,可以使用以下方法:

使用 systemctl 命令停止服务

systemctl stop mariadb

验证服务状态

systemctl status mariadb

测试数据库连接

mysql -u用户名 -p密码 -h主机地址 -e "SQL查询语句"

示例输出:

+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+

注意事项

  1. 需要具有 root 权限或 sudo 权限才能停止服务

  2. 停止服务后,所有现有数据库连接将被终止

  3. 在生产环境中停止数据库服务前,应确保没有关键操作正在进行

替代命令

对于不同发行版或 MySQL 版本,可能需要使用以下命令之一:

systemctl stop mysql
service mysql stop
/etc/init.d/mysql stop

故障排除

如果服务无法停止,可以尝试强制终止进程:

pkill -9 mysqld

停止 MySQL/MariaDB 服务的步骤

在 Linux 系统上停止 MySQL 或 MariaDB 服务,可以使用以下方法:

使用 systemctl 命令停止服务

systemctl stop mariadb

验证服务状态

systemctl status mariadb

测试数据库连接

mysql -u用户名 -p密码 -h主机地址 -e "SQL查询语句"

示例输出:

+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+

注意事项

  1. 需要具有 root 权限或 sudo 权限才能停止服务

  2. 停止服务后,所有现有数据库连接将被终止

  3. 在生产环境中停止数据库服务前,应确保没有关键操作正在进行

替代命令

对于不同发行版或 MySQL 版本,可能需要使用以下命令之一:

systemctl stop mysql
service mysql stop
/etc/init.d/mysql stop

故障排除

如果服务无法停止,可以尝试强制终止进程:

pkill -9 mysqld

以上就是nginx的部署及其实验!!

五.注意事项

 基础部署注意事项

1. 版本选择
   使用最新稳定版(Stable version)
   生产环境避免使用开发版(Mainline version)

2. 安装方式
   推荐源码编译安装以获得最佳性能
   可使用官方预编译包(如nginx.org提供的包)

3. 目录结构
    配置文件:/etc/nginx/nginx.conf
    站点配置:/etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/
    日志文件:/var/log/nginx/

性能优化配置

1. Worker进程
   nginx
   worker_processes auto;  # 自动匹配CPU核心数
   worker_rlimit_nofile 100000;  # 每个worker能打开的文件描述符数量
2. 事件模型
   nginx
   events {
       worker_connections 4096;  # 每个worker的最大连接数
       use epoll;  # Linux下高性能事件模型
       multi_accept on;  # 一次接受所有新连接
   }
   3. HTTP基础优化
   nginx
   http {
       sendfile on;  # 启用高效文件传输
       tcp_nopush on;  # 仅在sendfile开启时有效
       tcp_nodelay on;  # 禁用Nagle算法
       keepalive_timeout 65;  # 长连接超时时间
       keepalive_requests 1000;  # 单个长连接最大请求数
   }
   

安全配置要点

1. 基础安全
nginx
   server_tokens off;  # 隐藏Nginx版本信息
   add_header X-Frame-Options SAMEORIGIN;  # 防止点击劫持
   add_header X-Content-Type-Options nosniff;  # 禁止MIME类型嗅探
  

2. SSL/TLS配置
   nginx
   ssl_protocols TLSv1.2 TLSv1.3;  # 禁用旧版协议
   ssl_prefer_server_ciphers on;  # 优先使用服务器端加密套件
   ssl_session_cache shared:SSL:10m;  # SSL会话缓存
   ssl_session_timeout 10m;  # SSL会话超时
 

3. 访问控制
   nginx
   location /admin {
       allow 192.168.1.0/24;
       deny all;
   }
   

日志管理

1. 访问日志优化
   nginx
   access_log /var/log/nginx/access.log combined buffer=32k flush=5m;

2. 错误日志分级
   nginx
   error_log /var/log/nginx/error.log warn;

3. 日志轮转
   配置logrotate定期切割日志
   保持7-30天日志根据需求调整

高可用考虑

1. 负载均衡配置
   nginx
   upstream backend {
       least_conn;  # 最少连接算法
       server 10.0.0.1:80 max_fails=3 fail_timeout=30s;
       server 10.0.0.2:80 max_fails=3 fail_timeout=30s;
       keepalive 32;  # 保持到后端的长连接
   }

2. 健康检查
   被动检查:通过max_fails和fail_timeout
   主动检查:可结合第三方模块或商业版Nginx Plus

 维护与监控

1. 常用命令
   bash
   nginx -t  # 测试配置文件
   nginx -s reload  # 平滑重载配置
   nginx -s stop  # 快速停止

2. 监控指标
   活跃连接数
   请求处理速率
   各server块的状态码统计
   上游服务器健康状态

3. 定期维护
   检查错误日志中的异常
   监控磁盘空间(特别是日志文件)
    定期更新Nginx版本修复安全漏洞

常见问题排查

1. 连接数问题
   检查`worker_connections`和系统`ulimit`设置
   监控`netstat -ant | grep :80 | wc -l`

2. 性能瓶颈
   使用`strace`或`perf`分析慢请求
   检查后端响应时间与Nginx处理时间

3. 配置错误
   始终使用`nginx -t`测试配置
   分段注释排查复杂配置问题

环境准备

确保服务器操作系统为Linux(如CentOS、Ubuntu),建议使用最新稳定版本。安装前需更新系统包并安装基础依赖工具(如gcc、make、pcre、zlib、openssl)。

下载与安装

从Nginx官网获取最新稳定版源码包,解压后进入目录。编译时可通过--prefix指定安装路径(如/usr/local/nginx),添加模块如--with-http_ssl_module启用HTTPS支持。执行make && make install完成安装。

配置文件优化

主配置文件为nginx.conf,需调整以下关键参数:

  • worker_processes设置为CPU核心数
  • worker_connections建议为1024或更高
  • 启用gzip压缩减少传输体积
  • 设置keepalive_timeout优化长连接

安全加固

  • 禁用不必要的模块(如autoindex)
  • 限制敏感目录访问权限
  • 配置防火墙规则仅开放必要端口(80/443)
  • 使用非root用户运行Nginx(通过user指令)

日志管理

配置access_logerror_log路径,定期切割日志(可通过logrotate工具实现)。建议将日志级别调整为warn减少冗余记录。

服务管理

创建Systemd服务文件(/etc/systemd/system/nginx.service)以便启停控制。常用命令:

systemctl start nginx
systemctl enable nginx

性能监控

通过stub_status模块启用基础状态监控,或集成Prometheus+Grafana实现可视化监控。关键指标包括活跃连接数、请求吞吐量等。

以上就是所要注意的一些东西!!!

http://www.xdnf.cn/news/1279459.html

相关文章:

  • [4.2-2] NCCL新版本的register如何实现的?
  • ResponseBodyAdvice是什么?
  • ChatML vs Harmony:深度解析OpenAI全新对话结构格式的变化
  • ARM基础概念 day51
  • Redis应⽤-缓存与分布式锁
  • Vue3从入门到精通:3.1 性能优化策略深度解析
  • 基于SpringBoot+Uniapp的血压监控小程序(Echarts图形化分析)
  • OV5640 相机开发流程
  • Apollo平台下相机和激光雷达手眼联合标定
  • 游戏引擎(Unreal Engine、Unity、Godot等)大对比:选择最适合你的工具
  • 2025世界机器人大会,多形态机器人开启商业化落地浪潮
  • ubuntu24.04设置登陆背景图片
  • 工业相机与智能相机的区别
  • word的正则替换
  • 《解锁 C++ 进阶密码:引用补充与内联函数、nullptr 核心用法》
  • 【测试报告】SoundWave(Java+Selenium+Jmeter自动化测试)
  • 2025 年国内可用 Docker 镜像加速器地址
  • 前端组件库双雄对决:Bootstrap vs Element UI 完全指南
  • Flink TableAPI 按分钟统计数据量
  • Spring AI赋能图像识别:大数据模型驱动下的智能化变革
  • SAE J2716多协议网关的硬件架构与实时协议转换机制解析
  • calamine读取xlsx文件的方法比较
  • 华为虚拟防火墙配置案例详解
  • 未来物联网大模型:物联网硬件+底层驱动+AI 自动生成和调优LUA脚本,
  • 数据备份与进程管理
  • TikTok登录时显示“访问太频繁,请稍后再试”该怎么办?
  • 【数据库】如何使用一款轻量级数据库SqlSugar进行批量更新,以及查看最终的Sql操作语句
  • 【车联网kafka】Kafka核心架构与实战经验(第三篇)
  • Python FastAPI + React + Nginx 阿里云WINDOWS ECS部署实战:从标准流程到踩坑解决全记录
  • 2025面试题——(12)