1. 环境需求和说明
1.1. Nginx版本管理
Nginx隶属于开源产品,各个版本的区别主要有以下几种形式:
u Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版。
u Stable version:最新稳定版,生产环境上建议使用的版本。
u Legacy versions:遗留的老版本的稳定版。
一般选取软件的稳定版本,最新的稳定版。截止到文档更新日,稳定版1.220已经发布,发布日期为2021-11-16。
1.2. 系统安装要求
操作系统最好为linux系统。
1.3. 系统环境和软件版本
操作系统 | Linux |
适用nginx版本 | nginx1.20.0+ |
1.4. 文件系统(基础要求)
裸设备 | 文件系统 | 大小 | 说明 |
/lvnginx | /nginx | 10G | l 最少5G |
/lvnginxlogs | /nginx/logs | 20G根据业务需要 | l 裸设备可以根据需要定义l 文件系统可以挂载在其他位置。l 文件系统名称可以根据需要进行修改 |
在特殊系统中,日志文件可能不能挂载在/nginx/logs下,我们可以通过softlink保持目录结构的统一性。
1.5. 用户和组
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号(无登入权限),控制其访问权限,降低安全风险。创建一个名为nginx的用户和组。
组名 | 组ID(可默认或自定义) | 描述 |
nginx | 1000 | nginx组 |
用户规划:
用户 | 用户ID(可默认或自定义) | 主属组 | 组集 | 主目录 | 备注 |
nginx | 1000 | nginx | nginx运行用户 |
参考命令:
groupadd -g 1000 nginxuseradd nginx -u 1000 -g nginx -s /sbin/nologin -M
1.6. 端口设置
软件 | 端口 | 说明 |
nginx | 80 | 服务端侦听端口 |
注意:在linux系统中端口1~1024之间为root保留端口,其他用户无权使用,若要使用http和https默认端口80和443时只能以root用户身份启动nginx服务。
2. 安装
确保当前环境中存在gcc编译环境(gcc,gcc-c++)可通过查询当前系统中gcc的版本来确认是否完整安装
#gcc -#g++ -v
若显示有版本信息则说明编译环境完整,输出结果参考如下:
2.1. 安装依赖包
pcre | Perl库,正则表达式库 |
zlib | 数据压缩函式库 |
SSL | 用于nginx配置SSl证书配置,若不使用https协议可以不进行安装 |
通过如下命令查看当前环境是否存在相应的rpm安装包:
rpm -qa|grep -E ‘ssl|pcre|zlib’
若当前系统已挂载ios镜像或在可以连接外网的情况下可以使用yum安装,安装命令如下:
#安装pcre库yum install -y pcre pcre-devel#安装zlib压缩库yum install -y zlib zlib-devel#安装SSL证书依赖库yum install -y openssl openssl-devel
*备选离线安装方案*
如当前服务器未挂载ISO镜像也没有外网的条件下,可使用离线安装的方式补充依赖包。请按下列顺序安装;(请在官网中下载最新安装包,或自主选着指定版本的源码包)
源码包获取地址:
pcre编译安装包在http://www.pcre.org/上可以获取当前最新的版本
openssl编译安装包在http://www.openssl.org/source/上可以获取当前最新的版本
zlib编译安装包,在http://www.zlib.net/上可以获取当前最新的版本
本文档使用安装包分别为openssl-1.1.0f.tar.gz、zlib-1.2.12.tar.gz、pcre-8.45.tar.gz
本文下载的安装包放在/usr/local/src,本文依赖包均采用默认位置安装,如有指定路径请根据需要重新指定。(./configure -prefix 指定的路径)
安装zlib库
进入/usr/local/src,执行解压命令:
tar -xzvf zlib-1.2.12.tar.gz
依次执行安装命令:
#进入解压文件夹cd zlib-1.2.12 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install
安装pcre库
进入/usr/local/src,执行解压命令:
tar -xzvf pcre-8.45.tar.gz
执行安装命令:
#进入解压文件夹cd pcre-8.45 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install
安装SSL(选装:若不适用https协议可以不进行安装,防止后续有使用SSL认证,建议安装)
进入/usr/local/srcc,执行解压命令:
tar -xzvf openssl-1.1.0f.tar.gz
执行安装命令:
#进入解压文件夹cd openssl-1.1 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install
2.2. 安装Nginx
由于nginx是编译安装,目录可以自定义。目录以及模块配置如下:
指定软件安装位置 | /usr/local/nginx |
添加状态查询模块 | –with-http_stub_status_module |
添加pcre模块 | –with-pcre |
添加zlib模块 | –with-zlib |
解压nginx安装包,进行编译安装,参考如下命令执行:
#nginx安装包存放位置
cd /usr/local/src
#解压安装包文件
tar -zxvf nginx-1.20.0.tar.gz
#进入解压文件夹cd nginx-1.20.0
#预编译,指定nginx安装位置,添加nginx要加载的模块
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module
#编译安装过程
make && make install
若要加载更全依赖模块请参考如下命令进行编译
解压nginx安装包后,进行编译安装,参考如下命令执行:
./configure --prefix=l/nginx --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --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-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module
注:编译安装nginx时使用–with进行指定加载模块用“=”指定加载模块安装位置,指定的参数请参考上表。
3. Nginx配置
3.1. 基本参数配置
Nginx配置文件即为nginx.conf文件,对于Nginx参数的调整,都需要更改nginx.conf这个文件。
3.1.1. event配置
具体示例内容如下:
# 指定使用用户,设置完后只有指定的用户有权限启用
user nginx;
# 指定工作进程数,建议与当前系统CPU总核心数相同(或者整数倍),以达到最佳性能,CPU核数查询命令:cat /proc/cpuinfo| grep "processor"| wc -l
worker_processes 4;
# 启用epoll,linux系统默认使用方式
use epoll;
# 单个后台worker process进程的最大并发链接数也可根据要求调整,注意ulimit –n的值必须大于得于worker_connections的配置
worker_connections 1024;
3.1.2. http配置
具体示例内容如下:
# 设置日志格式(根据需要,可默认)
log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time "$http_x_forwarded_for" $request_time ';
access_log logs/main_access.log main;
# 设置keepalive超时
keepalive_timeout 65;
# 打开数据压缩(根据实际需求开启)
gzip on;
# 隐藏nginx版本号
server_tokens off;
server设置:
# 设置监听端口
listen 80;
# 设置域名名称
server_name localhost;
# 设置应用根目录(默认路径:/usr/local/nginx/html)
root htmlr;
location设置**:**
# 地址重写
location /base {
rewrite ^ (.*) /$1 last;
}
3.2. 反向代理配置
具体示例内容如下:
server {
listen 80;
server_name server.net;
location / {
proxy_pass http://connect; #反向代理地址
}
}
3.3. 负载均衡
nginx的负载均衡是通过模块upstream实现的。在http{}中添加服务器的地址即可实现负载均衡。示例内容如下:
http{
upstream firstdemo{
server 192.168.43.205;
server 192.168.43.206;
}
}
# 若是用户想第一次访问服务器后,下次访问时仍想访问同一台服务器,可使用ip_hash实现该情景。
http{
upstream firstdemo{
ip_hash;
server 192.168.43.205;
server 192.168.43.206;
}
}
3.4. http安全漏洞修复
针对安全部提出的以下漏洞:Web服务器配置为允许使用危险的HTTP方法,如PUT、MOVE、COPY、DELETE、PROPFIND、SEARCH、MKCOL、LOCK、UNLOCK、PROPPATCH,该配置可能允许未授权的用户对Web服务器进行敏感操作。
修复方案如下;
#在nginx.conf中的server部分添加:
if ($request_method !~ ^(GET|POST)$ ) {
return 403;
}
3.5. Nginx语法检测命令
启动nginx之前,测试语法是否能够通过。
nginx -t -c /nginx/conf/nginx.conf
注意:nginx -t 命令在root权限下执行时,若nginx.conf文件中未配置users 会对nginx安装路径下的temp路径进行属组修改,将文件夹属组修改为noboay 使用时要慎重。
4. 日志切割
Nginx的日志切割主要是通过操作系统的crontab来实现的。具体操作如下:
4.1. 设置切割脚本(脚本已部署)
编写分割日志脚本,并赋权755。
# vi /nginx/sbin/splitLog.sh
DATE=`date +'%Y%m%d'`
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/$DATE_access.log
touch access.log
# chmod 755 splitLog.sh
4.2. 设置crontab参考(未设置根据需要进行修改)
按照分时日月周的时间格式,调用脚本进行日志分割。
root用户执行(参考):
crontab -e
5 0 * * * ‘/nginx/sbin/splitLog.sh’
对crontab配置位数的说明如下:
5. nginx验证
5.1. 启停nginx
Nginx启动命令 | nginx |
Nginx停止命令 | nginx -s stop |
Nginx重载命令 | nginx -s reload |
5.2. 查看nginx状态
ps –ef |grep nginxnetstat -anp|grep nginx
5.3. 测试Nginx
启动nginx后,打开浏览器,输入该机器的ip地址,页面出现“Welcome to Nginx!”即表示Nginx成功搭建完成。
6. Keepalived安装
6.1. 环境准备
主机ip | 角色 | 部署软件 |
10.87.200.51 | master | keepalived、nginx |
10.87.200.52 | salve | keepalived、nginx |
10.87.200.53 | 虚ip |
6.2. Keepalived安装
使用yum源安装,安装命令如下:
#安装keepalived服务
yum -y install keepalived
#验证是否安装成功
rpm -ql keepalived
#显示结果(参考)
/etc/keepalived
/etc/keepalived/keepalived.conf # 主配置文件
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service
/usr/libexec/keepalived
/usr/sbin/keepalived
6.3. 监听存活脚本
在 /etc/keepalived/路径下创建nginx端口监听脚本check_port.sh
[root@localhost ~]#vim /etc/keepalived/check_port.sh
#!/bin/bash
#keepalived 监控端口脚本#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port {
#创建一个vrrp_script脚本,检查配置
# script "/etc/keepalived/check_port.sh 80"
#配置监听的端口
# interval 2 #检查脚本的频率,单位(秒)
#}
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
PORT_PROCESS=`ss -lnt|grep $CHK_PORT|wc -l`
if [ $PORT_PROCESS -eq 0 ];then
echo "Port $CHK_PORT Is Not Used,End."
exit 1
fi
else
echo "Check Port Cant Be Empty!"
fi
[root@localhost ~]# chmod +x /etc/keepalived/check_port.sh
6.4. Keepalived最终配置文件
Master(10.87.200.51)
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.87.200.51 #本机回环地址
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80" #nginx监听端口,若启动端口变更需要修改该端口
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens192 #keepalived服务绑定的网卡命令
virtual_router_id 251
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx #调用nginx端口监控脚本
}
virtual_ipaddress {
10.87.200.53 #keepalived的虚拟VIP地址
}
}
Slave配置(10.87.200.52)
! Configuration File for keepalived
global_defs {
router_id 10.87.200.52
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 251
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.87.200.53
}
}
6.5. 启动主从的Keepalived
#查询keepalived服务状态
systemctl status keepalived
#手动启动keepalived服务
systemctl start keepalived
#手动停止keepalived服务
systemctl stop keepalived
#将Keepalived设置为开机自启动
systemctl enable keepalive
6.6. 验证keepalived功能
修改nginx(10.87.200.51)启动访问页面
#进入nginx主页面配置文件夹
cd /usr/local/nginx/html/
#备份nginx默认访问页面
mv index.html index.html_bak
#修改index.html文件
vim index.html
#index.html文件内容
I am 10.87.200.51
修改nginx(10.87.200.52)启动访问页面
cd /usr/local/nginx/html/
mv index.html index.html_bak
vim index.html
I am 10.87.200.52
重启nginx服务
/usr/local/nginx/sbin/nginx -s reload
浏览器访问http://10.87.200.53:80
查看返回页面示例如下:
在服务器中查看keepalived的绑定状态
查看keepalived的命令:ip a
手动停止10.87.200.51上的nginx服务查看是否会正常切换VIP(10.87.200.53)
重新访问http://10.87.200.53:80显示如下,说明正常切换。
注意:在测试完成后,出于安全考虑,在访问页面不要展示真实IP地址,所以测试完成后要将nginx页面修改回默认页面,并重新niginx服务
7. OS系统优化
7.1. 修改limit参数
优化资源限制
#ulimit -n
1024
#ulimit- u
1024
修改open files和max user processes
1、在/etc/rc.local中增加一行 ulimit -SHn 65535
2、在/etc/profile中增加一行 ulimit -SHn 65535
3、在/etc/security/limits.conf最后增加:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
要使参数生效,方法为:
1、退出当前登入窗口重新登入
2、重启OS系统
7.2. 修改sysctl
net.ipv4.tcp_max_tw_buckets = 6000 #timewait数量,默认180000。
net.ipv4.tcp_tw_recycle = 1 #启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1 #允许TIME-WAIT sockets重用与新TCP连接。
net.ipv4.tcp_syncookies = 1 #出现SYN等待队列溢出时启动cookies处理。
net.core.somaxconn = 262144 #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.netdev_max_backlog = 262144 #每个网络接口接收数据包的熟虑比内核处理这些把的速率快时,允许送到对垒的数据报的最大数目。
net.ipv4.tcp_max_orphans = 262144 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分一老它或者人为的减小这个值。更应该增加这个值(增加内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144 #记录的那些尚未收到客户端确认信息的连接请求的最大值。
net.ipv4.tcp_timestamps = 0 #时间戳可以避免序列号的券绕。
net.ipv4.tcp_synack_retries = 1 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次我说,这个设置决定了内核放弃连接之前发送SYN+ACK报的数量。
net.ipv4.tcp_syn_retries = 1 #在内核放弃建议俩姐之前发送SYN报的数量。
net.ipv4.tcp——keepalive_time=30 #当keepalive启用的时候,TCP发送keepalive消息的频度。默认是2小时。
修改后使用“sysctl -p”使参数生效。