【中间件系列一】Nginx1.18.0编译安装、配置规范化

一、资源配置标准

1、操作系统版本选择

CentOS7.2+【当前案例版本7.6】

2、虚机资源配置标准

1C+/4G+/20G+

3、网络策略配置标准

端口根据实际需求而定,1024及以下端口需要具有root权限的用户进行启动;1024以上的端口在未占用的情况下直接启动即可。

二、系统配置标准

1、系统基础环境标准化

  • 时区设置检查
[root@mo ~]# date -R     #验证时区
  • 时间同步标准
检查时间是否与北京时间一致,如果内网配置有时间同步服务器,需要配置时间同步
[root@mo ~]# date
Fri Nov 25 23:20:57 CST 2016
  • HOST配置标准
#特殊情况下可以在nginx主机按照以下内容配置hosts解析,只需按需添加最后一行即可
[root@mo ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 xxx.xxxxx.xxx #特殊情况下可以在nginx主机配置hosts解析
  • DNS解析配置
#如果需要配置内网DNS服务器解析,按照以下内容配置操作
[root@mo ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1 #此处配置为内网DNS解析地址

2、系统参数配置标准化

  • 内核参数配置标准
#内核参数配置
#单个进程可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需要根据实际业务情况配置。实际并发连接数/worker_process数
fs.file-max = 999999【值据实而定】
#启动IP转发功能。0表示不开启,1表示开启。如果将Linux系统作为路由或者VPN服务就必须要开启IP转发功能
net.ipv4.ip_forward = 0
#此参数有三个值0/1/2
#0:不开启源地址校验
#1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包
#2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意端口),如果反向路径不通,则直接丢弃该数据包。
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。该参数与性能无关,用于解决TCP的SYN攻击。
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。注:主动关闭连接的服务器端会产生TIME_WAIT状态的连接
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
#这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_rmem = 10240 87380 12582912
#这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912
#这个参数表示内核套接字发送缓存区默认的大小。
net.core.wmem_default = 8388608
#这个参数表示内核套接字接受缓存区默认的大小。
net.core.rmem_default = 8388608
#这个参数表示内核套接字接受缓存区的最大大小。
net.core.rmem_max = 16777216
#这个参数表示内核套接字发送缓存区的最大大小。
net.core.wmem_max = 16777216
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144
#web 应用中 listen 函数的 backlog 默认会给我们内核参数的。限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关。somaxconn定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
#这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
#启用timewait快速回收
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME_WAIT状态的连接。
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
#这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
  • 最大文件打开数配置标准
① 查看当前进程最大打开文件数
#第一种方式
[root@mo ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14951
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14951
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
#第二种方式
[root@mo ~]# ulimit -n
102400
② 查看系统最大打开文件数配置
[root@mo ~]# cat /proc/sys/fs/file-max 
378000
③ 修改当前进程最大打开文件数
[root@mo ~]# vi /etc/security/limits.conf
#new add
 -          soft    nofile    4096
 -          hard    nofile    65536
 -          soft    nproc     2047
 -          hard    nproc     16384
[root@mo ~]# vi /etc/security/limits.d/20-nproc.conf
 -          soft    nofile    4096
 -          hard    nofile    65536
 -          soft    nproc     2047
 -          hard    nproc     16384
#重启服务器
④ 修改系统最大打开文件数
[root@mo ~]# vim /proc/sys/fs/file-max
655360
:wq保存退出
  • 安装用户新增标准
#添加nginx用户组以及nginx用户,默认赋予nginx用户/home/nginx目录所有权限
[root@mo ~]# groupadd nginx
[root@mo ~]# useradd nginx -g nginx

3、系统安全配置标准化

  • 防火墙配置标准
systemctl stop firewalld.service           # 关闭
systemctl disable firewalld.service        # 取消开机启动
firewall-cmd --state                       #查看默认防火墙状态(关闭后显示not running,开启后显示running)
  • selinux配置标准
#查看selinux状态
sestatus
#临时关闭
setenforce 0
#永久关闭
vim /etc/selinux/config
SELINUX=disabled

三、Nginx配置标准

1、Nginx安装配置标准

  • 依赖安装标准化
#yum安装Nginx编译所需所有依赖,出现如下内容即为安装完成
[root@mo ~]# yum install -y gcc gcc-c++ autoconf automake make glibc-devel glibc openssl openssl-devel unzip
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
......
Complete!
  • 源文件目录标准化
#切换nginx用户创建源文件目录/home/nginx/sourcefile
[root@mo ~]# su – nginx
上一次登录:一 6月 15 09:20:25 CST 2020pts/0 上
[nginx@mo ~]$ mkdir -p /home/nginx/sourcefile
[nginx@mo ~]$ ll /home/nginx
总用量 0
drwxrwxr-x. 4 nginx nginx 91 6月  10 11:11 sourcefile
#上传源文件到新创建的源文件目录/home/nginx/sourcefile
[nginx@mo ~]$ ls -l /home/nginx/sourcefile/
总用量 3300
-rw-r--r--. 1 nginx nginx 1039530 6月   8 11:01 nginx-1.18.0.tar.gz
-rw-r--r--. 1 nginx nginx 2324622 6月   8 11:17 pcre-8.44.zip
  • 安装目录标准化
/home/nginx/nginx								Nginx安装主目录
/home/nginx/nginx/conf/nginx.conf				主配置文件路径
/home/nginx/nginx/conf/conf.d/vhost				虚机主机配置文件目录
/home/nginx/nginx/conf/conf.d/upstream			upstream配置文件目录
/home/nginx/nginx/conf/conf.d/ssl				ssl证书配置文件目录
/home/nginx/nginx/conf/conf.d/gzip				gzip配置文件目录
/home/nginx/nginx/logs							Nginx日志文件统一存放目录
/home/nginx/nginx/temp							Nginx临时文件目录
/home/nginx/nginx/sbin							Nginx可执行二进制文件目录
  • 编译命令规范化
#解压源文件目录中nginx-1.18.0.tar.gz以及pcre-8.44.zip包
[nginx@mo ~]$ cd /home/nginx/sourcefile
[nginx@mo ~]$ tar -zxvf nginx-1.18.0.tar.gz
[nginx@mo ~]$ unzip pcre-8.44.zip
#进入nginx源文件目录执行预编译
[nginx@mo ~]$ cd /home/nginx/sourcefile/nginx-1.18.0/
[nginx@mo nginx-1.18.0]$ ./configure --prefix=/home/nginx/nginx --conf-path=/home/nginx/nginx/conf/nginx.conf --sbin-path=/home/nginx/nginx/sbin/nginx --error-log-path=/home/nginx/nginx/logs/error.log --http-log-path=/home/nginx/nginx/logs/access.log --with-http_ssl_module --with-http_gzip_static_module --with-pcre=/home/nginx/sourcefile/pcre-8.44 --http-client-body-temp-path=/home/nginx/nginx/temp/client_body_temp --http-proxy-temp-path=/home/nginx/nginx/temp/proxy_temp --http-fastcgi-temp-path=/home/nginx/nginx/temp/fastcgi_temp --http-uwsgi-temp-path=/home/nginx/nginx/temp/uwsgi_temp --http-scgi-temp-path=/home/nginx/nginx/temp/scgi_temp
checking for OS
 + Linux 3.10.0-862.el7.x86_64 x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
checking for gcc -pipe switch ... found
......
creating objs/Makefile

Configuration summary
  + using PCRE library: /home/nginx/sourcefile/pcre-8.44
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/home/nginx/nginx"
  nginx binary file: "/home/nginx/nginx/sbin/nginx"
  nginx modules path: "/home/nginx/nginx/modules"
  nginx configuration prefix: "/home/nginx/nginx/conf"
  nginx configuration file: "/home/nginx/nginx/conf/nginx.conf"
  nginx pid file: "/home/nginx/nginx/logs/nginx.pid"
  nginx error log file: "/home/nginx/nginx/logs/error.log"
  nginx http access log file: "/home/nginx/nginx/logs/access.log"
  nginx http client request body temporary files: "/home/nginx/nginx/temp/client_body_temp"
  nginx http proxy temporary files: "/home/nginx/nginx/temp/proxy_temp"
  nginx http fastcgi temporary files: "/home/nginx/nginx/temp/fastcgi_temp"
  nginx http uwsgi temporary files: "/home/nginx/nginx/temp/uwsgi_temp"
  nginx http scgi temporary files: "/home/nginx/nginx/temp/scgi_temp"
#执行make进行编译,如果主机CPU内存资源配置高,可以通过make -j2这种方式进行编译以提升编译效率。【注意:-j后面数字不建议超过CPU核数】
[nginx@mo nginx-1.18.0]$ make
make -f objs/Makefile
make[1]: 进入目录“/home/nginx/sourcefile/nginx-1.18.0”
......
make[1]: 离开目录“/home/nginx/sourcefile/nginx-1.18.0”
[nginx@mo nginx-1.18.0]$ make install
make -f objs/Makefile install
make[1]: 进入目录“/home/nginx/sourcefile/nginx-1.18.0”
......
mkdir -p '/home/nginx/nginx/logs'
make[1]: 离开目录“/home/nginx/sourcefile/nginx-1.18.0
  • 参数配置标准化
① 端口配置标准
根据网络策略配置标准所使用端口来确定是否需要对nginx用户进行提权操作
#如果nginx使用端口为1024以下,则需要对普通用户进行提权,例如对nginx用户进行提权
#如果nginx使用端口为1024以上,则在保证端口未被占用的情况下,可以直接使用,无需提权操作
默认为80,需要进行提权操作
② 主配置文件标准
1)nginx.conf
[nginx@mo ~]$ cd /home/nginx/nginx/conf
[nginx@mo conf]$ vim nginx.conf
### Nginx主配置
# worker_process启动用户配置
user  nginx;
# worker_process数配置
worker_processes  auto;
# 错误日志存储以及要保存的错误日志级别【debug|info|notice|warn|error|crit|alert|emerg】
error_log  logs/error.log  warn;
error_log  logs/error.log  error;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
# nginx进程pid文件存储
pid        logs/nginx.pid;
# epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以提升nginx性能
# 单个worker_process进程的最大并发连接数,根据CPU性能和业务需求而定
events {
    use	epoll;
    worker_connections  1024; 		
}
### http块配置
http {
		include       mime.types;	#设定mime类型,类型由mime.type文件定义;
#默认配置,这里表示引用context-type的配置文件。如需要添加新的类型,手动在此文件中添加即可
		default_type  application/octet-stream;		#此参数为默认context-type类型定义
		charset	utf-8;			#默认编码
		keepalive_timeout 65;		#会话超时时间
		#access_log  logs/access.log  main;	#主日志文件,不建议在这里配置,因为这里日志无法进行按照日期切割;
		log_format  main  '$remote_addr || $remote_user [$time_local] || "$request" || $status || $body_bytes_sent || "$http_referer" || "$http_user_agent" || "$http_x_forwarded_for" || $upstream_status || $upstream_addr || "$upstream_cache_status" || $request_time $upstream_response_time';		#日志格式定义
		sendfile on;				#开启调用linux的sendfile功能,提高文件传输效率
		server_tokens off;		#隐藏nginx版本显示
		include conf.d/vhost/*.conf;		#引用所有的虚拟主机文件
		include conf.d/upstream/*.conf;	#引用所有的upstream配置文件
}
2) server块配置[vhost]
[nginx@mo ~]$ cd /home/nginx/nginx/conf/conf.d/vhost
[nginx@vhost ~]$ vim nginx_default.conf
server {
listen	8080;					#nginx所监听的此server对外提供服务的端口
	server_name  192.168.1.1;			#此处支持一到多个域名或者IP
#下面配置用于切割日志文件使用
	if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
		set $year $1;
		set $month $2;
		set $day $3;
	}
	include conf.d/gzip/*.conf;		#gzip的配置文件路径,此处可以根据情况配置,如果有压缩需求,在server层配置覆盖掉默认配置即可;
	location / {
		root html;					#静态文件目录
		index index.html;				#索引文件,这两项参数根据项目需要进行取舍;
		proxy_set_header Host $host:$server_port;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Real-PORT $remote_port;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	#透传客户端真实IP,加入到请求的header当中,后端如果需要获取,虚引用request的header信息中的X-Forwarded-For参数得到真实IP
     proxy_pass http://upstream_default/;     #此处为代理后端地址配置,引用upstream的配置名
		access_log logs/upstream_default_access-$year$month$day.log main;	#日志针对具体server块进行配置,用以切割以及问题定位;
	}
	error_page 404 502 503 504 500 /50x.html;
	location = /50x.html {
		root html;
		access_log logs/error_$year$month$day.log;	#此处为错误请求返回码返回页面配置,如果代理后端定义有,此处无需配置;
	}
}
3) upstream块配置[upstream]
[nginx@mo ~]$ cd /home/nginx/nginx/conf/conf.d/upstream
[nginx@upstream ~]$ vim upstream_default.conf
upstream upstream_default {
	#ip_hash;	#代理访问策略,这里为ip_hash绑定的方式,根据应用情况自行考虑配置
	server 192.168.1.2:8081;	#此处配置为服务真实地址及端口
	#check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;	#此参数取决于是否安装了ngx_upstream_check_module健康拨测模块,作用是用以检测后端服务的健康状态;可以根据实际需求调整参数,比如type,可以为tcp、http等方式
}
4) gzip配置[gzip]
[nginx@mo ~]$ cd /home/nginx/nginx/conf/conf.d/gzip
[nginx@gzip ~]$ vim gzip_default.conf
gzip on;									#启用gzip压缩
gzip_min_length	2k;								#gzip压缩的最小文件,小于此大小的不进行压缩
gzip_buffers	4 16k;								#设置缓冲区大小和数量
gzip_comp_level	2;								#压缩级别,1-9,值越小压缩程度越高,但压缩越小越耗cpu
gzip_types text/js image/jepg image/png text/plain text/css text/javascript; 	#根据实际情况,如果有新的需要压缩的类型,在此处添加即可
gzip_vary on;									#根据客户端的http头来判断是否需要压缩,不支持的不压缩
  • 脚本启停标准化
#!/bin/bash
#*************************************************************
#Author: Yifeng
#Date:  2020-06-22
#FileName: script.sh 
#Description: 仅用于nginx标准化启停
#*************************************************************
OPTION=$1
green_echo ()    { [ "$HASTTY" == 0 ] && echo "$@" || echo -e "\033[032;1m$@\033[0m"; }
help()
{
	echo "$(green_echo 'USAGE: sh script.sh [start|reload|fast_stop|normal_stop]')"
}
if [[ $OPTION == "-h" ]] || [[ $OPTION == "--help" ]]
then
	help;
else 
	case $OPTION in
		start)
			/home/nginx/nginx/sbin/nginx -t -c /home/nginx/nginx/conf/nginx.conf
	        	if [ $? -eq 0 ]
        		then
               			/home/nginx/nginx/sbin/nginx -c /home/nginx/nginx/conf/nginx.conf
        		fi
			;;
		reload)
			/home/nginx/nginx/sbin/nginx -t -c /home/nginx/nginx/conf/nginx.conf
			if [ $? -eq 0 ]
			then
				/home/nginx/nginx/sbin/nginx -s reload
			fi
			;;
                fast_stop)
			/home/nginx/nginx/sbin/nginx -s stop
                        ;;
                normal_stop)
                        /home/nginx/nginx/sbin/nginx -s quit
                        ;;
                *)
                	help
                        ;;
	esac
fi
① 停止Nginx脚本
#脚本停止nginx用法
USAGE: sh script.sh [fast_stop|normal_stop]
② 启动Nginx脚本
#脚本启动nginx用法
USAGE: sh script.sh [start]
③ 重载nginx
#脚本重载nginx用法
USAGE: sh script.sh [reload]

四、日志管理标准

1、日志文件规范标准化

  • 日志存储路径标准化
① 统一路径标准
# Nginx日志目录规范。
/home/nginx/nginx/logs							#Nginx日志文件统一存放目录
# 错误日志存储以及要保存的错误日志级别【debug|info|notice|warn|error|crit|alert|emerg】
error_log  logs/error.log  warn;
error_log  logs/error.log  error;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
  • 日志文件切割标准化
① 按时间/ByTime
#下面配置用于切割日志文件使用
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
		set $year $1;
		set $month $2;
		set $day $3;
	}
access_log logs/upstream_default_access-$year$month$day.log main;	#日志针对具体server块进行配置,用以切割以及问题定位;
access_log logs/error_$year$month$day.log;	#此处为错误请求返回码返回页面配置,如果代理后端定义有,此处无需配置

2、日志保留周期标准化

#日志按天切割压缩清理,保留90天之内的日志, 15天之前的日志进行压缩。

3、日志清理规则标准化

#日志按天切割压缩清理, 90天之前的日志清理掉

4、日志清理脚本标准化

  • 日志压缩规则
#压缩规则采用打包成tar.gz的方式进行压缩存储
  • 日志清理规则
#压缩规则采用脚本清理tar.gz压缩包的方式进行清理

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值