概述
本来没想过写一个自动部署nginx服务脚本,主要很多模块要考虑,不好做一些标准的内容,但是开发有需求,那就顺便写一下好了…
这里顺便集成了nginx优化参数的一些内容,仅供参考。
常用模块
这里集成的一些模块如下:
#常用module
#ngx_http_core_module:核心模块;内置模块。
#ngx_http_upstream_module:“upstream”模块,内置模块,核心模块;用于请求的“负载均衡”。
#ngx_http_proxy_module:“请求代理”模块,核心模块;将请求转发给代理Server,或者对请求进行额外的cache操作。
#ngx_http_rewrite_module:“URL重写”模块,内置模块;根据规则,rewrite特定的URL并转发给代理Server。
#ngx_http_access_module:“访问控制”模块;“允许”或者“拒绝”特定的IP列表对server的访问,内置模块。
#ngx_http_limit_conn_module:“访问控制”模块;可以限定每个key(可以为客户端IP)允许的最大并发连接数,内置模块。
#ngx_http_limit_req_module:“访问控制”模块;可以限定每个key(可以为客户端IP)在单位之间内允许处理的request个数,“流量控制”,内置模块。
#ngx_http_headers_module:“header”模块;主要是“add_header”和“expired”两个指令,向response中添加header信息,内置模块。
#ngx_http_charset_module:“字符集”模块;在响应头部的“Content-Type”中增加charset信息,内置模块。
#ngx_http_addition_module:“增添”模块;在response内容之前或者之后额外添加文本信息,内置模块。
#ngx_http_sub_module:“后置修改响应”模块;可以过滤并替换response内容中特定的字符串,附加模块,需要在编译时指定“--with-http_sub_module”。
#ngx_http_fastcgi_module:将请求发送给“fastcgi”服务器,内置模块。
#ngx_http_geo_module:“geo”模块;创建一个变量,此变量的值由client ip值决定,对实现小型私有“CDN”方案有参考价值,内置模块。
#ngx_http_geoip_module:“geo”模块;通过配置(数据源)可以得知clientip所属的“城市”、“区域”等信息,对实现小型私有的CDN有一定的参考价值,附加模块,需要在编译时指定“--with-http_geoip_module”。
#ngx_http_gzip_module:“gzip”模块;对response使用gzip压缩,对减少数据传输量有益,内置模块。
#ngx_http_gzip_static_module:“gzip”模块;对response使用gzip压缩,输出为“.gz”文件,附加模块,需要在编译时指定“--with-http_gzip_static_module”。
#ngx_http_image_filter_module:“图片”模块;可以对“JPEG”、“GIF”、“PNG”格式的图片进行裁剪等操作,附加模块,需要在编译时指定“--with-http_image_filter_module”。
#ngx_http_status_module/ngx_http_stub_status_module:“nginx内部状态”模块;用于获取nginx内部的一些状态统计信息,通常用来获取一些简单的统计数据,其中nginx_http_stub_status_module为附加模块,编译时需要指定“--with-http_stub_status_module”。
#nginx-http-concat:第三方附加模块,由taobao开发,主要用于合并“静态资源”请求,提升性能,需要额外下载,并在编译时添加“--add-module=software/nginx-http-concat-master”。(https://github.com/alibaba/nginx-http-concat)
#ngx_cache_purge:第三方附加模块,由frickle提供,当在proxy中使用cache保存静态资源时,那么cache_purge模块提供删除过期数据的功能支持,需要额外下载,并在编译时添加“--add-module=software/ngx_cache_purge”。(http://labs.frickle.com/nginx_ngx_cache_purge/)
#nginx_upstream_check_module:第三方附加模块,由taobao开发,通过它检测后端 realserver的健康状态,如果后端 realserver 不可用,则请求就不会转发到该节点上,该模块需打补丁。
#nginx-module-vts:第三方附加模块,Nginx virtual host traffic status module,nginx的监控模块,能够提供json、html、prometheus格式的数据产出。
#nginx-sticky-module:第三方附加模块,sticky模块与Ip_hash都是与负载均衡算法相关,Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route。
#wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
#ngx_http_referer_module:内置模块,可根据header中的referer信息屏蔽某些请求对网站或应用的访问,可以起到禁止直接访问网站static files的作用(防盗链或保护文件)
#nginx-http-sysguard:阿里巴巴开发的一个 Nginx 模块,用来保护运行 Nginx 服务器的系统负载和内存使用不会太高,不支持最新版本。
自动部署nginx脚本
部署脚本如下,基于centos7系统测试,源是用的阿里源。
#!/bin/bash
#################################
# copyright by hwb
# DATE:2021-05-05
#
# 自动化部署nginx 1.20
# 脚本及安装包统一放在/opt目录下
#################################
#nginx
NGINX_USER=nginx
NGINX_GROUP=nginx
NGINX_HOME=/usr/local/nginx
NGINX_PORT=80
NGINX_SOFTWARE=/opt/nginx
#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
source /etc/profile
#Require root to run this script.
[ $(id -u) -gt 0 ] && echo "请用root用户执行此脚本!" && exit 1
install_nginx_el7(){
echo ""
echo -e "\033[33m***********************************************自动部署nginx服务*****************************************************\033[0m"
#建用户及目录
groupadd -r nginx && useradd -r -g nginx nginx -d /home/nginx -m
[ -d ${NGINX_SOFTWARE} ] || mkdir -p ${NGINX_SOFTWARE}
#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#常用module
#ngx_http_core_module:核心模块;内置模块。
#ngx_http_upstream_module:“upstream”模块,内置模块,核心模块;用于请求的“负载均衡”。
#ngx_http_proxy_module:“请求代理”模块,核心模块;将请求转发给代理Server,或者对请求进行额外的cache操作。
#ngx_http_rewrite_module:“URL重写”模块,内置模块;根据规则,rewrite特定的URL并转发给代理Server。
#ngx_http_access_module:“访问控制”模块;“允许”或者“拒绝”特定的IP列表对server的访问,内置模块。
#ngx_http_limit_conn_module:“访问控制”模块;可以限定每个key(可以为客户端IP)允许的最大并发连接数,内置模块。
#ngx_http_limit_req_module:“访问控制”模块;可以限定每个key(可以为客户端IP)在单位之间内允许处理的request个数,“流量控制”,内置模块。
#ngx_http_headers_module:“header”模块;主要是“add_header”和“expired”两个指令,向response中添加header信息,内置模块。
#ngx_http_charset_module:“字符集”模块;在响应头部的“Content-Type”中增加charset信息,内置模块。
#ngx_http_addition_module:“增添”模块;在response内容之前或者之后额外添加文本信息,内置模块。
#ngx_http_sub_module:“后置修改响应”模块;可以过滤并替换response内容中特定的字符串,附加模块,需要在编译时指定“--with-http_sub_module”。
#ngx_http_fastcgi_module:将请求发送给“fastcgi”服务器,内置模块。
#ngx_http_geo_module:“geo”模块;创建一个变量,此变量的值由client ip值决定,对实现小型私有“CDN”方案有参考价值,内置模块。
#ngx_http_geoip_module:“geo”模块;通过配置(数据源)可以得知clientip所属的“城市”、“区域”等信息,对实现小型私有的CDN有一定的参考价值,附加模块,需要在编译时指定“--with-http_geoip_module”。
#ngx_http_gzip_module:“gzip”模块;对response使用gzip压缩,对减少数据传输量有益,内置模块。
#ngx_http_gzip_static_module:“gzip”模块;对response使用gzip压缩,输出为“.gz”文件,附加模块,需要在编译时指定“--with-http_gzip_static_module”。
#ngx_http_image_filter_module:“图片”模块;可以对“JPEG”、“GIF”、“PNG”格式的图片进行裁剪等操作,附加模块,需要在编译时指定“--with-http_image_filter_module”。
#ngx_http_status_module/ngx_http_stub_status_module:“nginx内部状态”模块;用于获取nginx内部的一些状态统计信息,通常用来获取一些简单的统计数据,其中nginx_http_stub_status_module为附加模块,编译时需要指定“--with-http_stub_status_module”。
#nginx-http-concat:第三方附加模块,由taobao开发,主要用于合并“静态资源”请求,提升性能,需要额外下载,并在编译时添加“--add-module=software/nginx-http-concat-master”。(https://github.com/alibaba/nginx-http-concat)
#ngx_cache_purge:第三方附加模块,由frickle提供,当在proxy中使用cache保存静态资源时,那么cache_purge模块提供删除过期数据的功能支持,需要额外下载,并在编译时添加“--add-module=software/ngx_cache_purge”。(http://labs.frickle.com/nginx_ngx_cache_purge/)
#nginx_upstream_check_module:第三方附加模块,由taobao开发,通过它检测后端 realserver的健康状态,如果后端 realserver 不可用,则请求就不会转发到该节点上,该模块需打补丁。
#nginx-module-vts:第三方附加模块,Nginx virtual host traffic status module,nginx的监控模块,能够提供json、html、prometheus格式的数据产出。
#nginx-sticky-module:第三方附加模块,sticky模块与Ip_hash都是与负载均衡算法相关,Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route。
#wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
#ngx_http_referer_module:内置模块,可根据header中的referer信息屏蔽某些请求对网站或应用的访问,可以起到禁止直接访问网站static files的作用(防盗链或保护文件)
#nginx-http-sysguard:阿里巴巴开发的一个 Nginx 模块,用来保护运行 Nginx 服务器的系统负载和内存使用不会太高,不支持最新版本。
#下载nginx安装包
if [ -f ${NGINX_SOFTWARE}/nginx-1.20.0.tar.gz ] && [ -f ${NGINX_SOFTWARE}/nginx_upstream_check_module-master.zip ] && [ -f ${NGINX_SOFTWARE}/nginx_upstream_check_module-master.zip ] && [ -f ${NGINX_SOFTWARE}/nginx-http-concat-master.zip ] && [ -f ${NGINX_SOFTWARE}/nginx-module-vts-master.zip ] && [ -f ${NGINX_SOFTWARE}/nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz ] && [ -f ${NGINX_SOFTWARE}/ngx_cache_purge-2.3.tar.gz ];then
action "*****已存在nginx安装包,无需下载*****" /bin/true
else
ping -c 4 app.fslgz.com >/dev/null 2>&1
if [ $? -eq 0 ];then
#wget http://nginx.org/download/nginx-1.20.0.tar.gz -P /opt
#wget https://codeload.github.com/alibaba/nginx-http-concat/zip/master -P /opt
#wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz -P /opt
#wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master -P /opt
#wget https://codeload.github.com/vozlt/nginx-module-vts/zip/refs/heads/master -P /opt
#wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz -P /opt
#wget https://github.com/alibaba/nginx-http-sysguard/archive/master.zip -O nginx-http-sysguard-master.zip -P /opt
#wget --progress=bar:force https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839506330304708608 -O ${NGINX_SOFTWARE}/nginx-1.20.0.tar.gz 2>&1 | progressfilt
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839506330304708608 -O ${NGINX_SOFTWARE}/nginx-1.20.0.tar.gz
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839568288638894080 -O ${NGINX_SOFTWARE}/nginx_upstream_check_module-master.zip
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839568884758544384 -O ${NGINX_SOFTWARE}/nginx-http-concat-master.zip
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839569060348887040 -O ${NGINX_SOFTWARE}/nginx-http-sysguard-master.zip
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839569209208930304 -O ${NGINX_SOFTWARE}/nginx-module-vts-master.zip
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839568746614947840 -O ${NGINX_SOFTWARE}/nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=839569359721529344 -O ${NGINX_SOFTWARE}/ngx_cache_purge-2.3.tar.gz
[ $? -eq 0 ] && action "nginx安装包及依赖包下载完成!" /bin/true
else
action "please download nginx package manual!" /bin/false
exit $?
fi
fi
#安装依赖包及打补丁
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel patch gd-devel libgd2-xpm libgd2-xpm-dev GeoIP-devel.x86_64 >/dev/null
[ $? -eq 0 ] || action "依赖包未安装成功" /bin/false || exit $?
cd ${NGINX_SOFTWARE} && tar -xvf nginx-1.20.0.tar.gz >/dev/null && unzip nginx_upstream_check_module-master.zip >/dev/null && unzip nginx-http-concat-master.zip >/dev/null && unzip nginx-http-sysguard-master.zip >/dev/null && unzip nginx-module-vts-master.zip >/dev/null && tar -xvf ngx_cache_purge-2.3.tar.gz >/dev/null && tar -xvf nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz >/dev/null && mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 nginx-sticky-module
chown -R root:root ${NGINX_SOFTWARE} && chmod -R 755 ${NGINX_SOFTWARE}
action "*****开始打补丁*****" /bin/true
cd ${NGINX_SOFTWARE}/nginx-1.20.0
patch -p1 < ../nginx_upstream_check_module-master/check_1.16.1+.patch
#patch -p1 < ../nginx-http-sysguard-master/nginx_sysguard_1.3.9.patch
#编译安装nginx
ps -ef|grep nginx |grep -v grep|grep -v sh
if [ $? -eq 0 ] ;then
action "*****已存在nginx进程*****" /bin/false
exit $?
else
# 卸载 nginx
rpm -qa|grep nginx|xargs -i rpm -e --nodeps {}
# 安装nginx
action "*****编译安装nginx*****" /bin/true
cd ${NGINX_SOFTWARE}/nginx-1.20.0
./configure --user=${NGINX_USER} --group=${NGINX_GROUP} --prefix=${NGINX_HOME} --with-threads --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-stream --with-http_flv_module --with-http_mp4_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" --with-file-aio --with-debug --with-cc-opt='-g -O0' --add-module=${NGINX_SOFTWARE}/nginx_upstream_check_module-master --add-module=${NGINX_SOFTWARE}/nginx-module-vts-master --add-module=${NGINX_SOFTWARE}/nginx-sticky-module --add-module=${NGINX_SOFTWARE}/nginx-http-concat-master --add-module=${NGINX_SOFTWARE}/ngx_cache_purge-2.3/ >/dev/null
make >/dev/null && make install >/dev/null
[ $? -eq 0 ] && action "*****nginx编译安装成功*****" /bin/true
fi
cat > ${NGINX_HOME}/conf/nginx.conf <<EOF
user ${NGINX_USER} ${NGINX_GROUP};
#工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU
worker_processes 8;
worker_cpu_affinity auto;
#指定进程可以打开的最大描述符:数目
worker_rlimit_nofile 65535;
error_log logs/error.log notice;
events {
#使用epoll的I/O 模型
use epoll;
accept_mutex off;
worker_connections 204800;
}
http {
include mime.types; #设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
log_format main '[\$time_local] \$remote_addr - \$remote_user "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
log_format log404 '[\$time_local] \$status \$remote_addr \$host$request_uri \$sent_http_location';
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404; #用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
sendfile on; #指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on
tcp_nopush on; #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
tcp_nodelay on;
keepalive_timeout 600; #keepalive超时时间
server_names_hash_bucket_size 128;
server_tokens off; #隐藏版本号
vhost_traffic_status_zone; #流量监控,在server段增加/status配置
server {
listen ${NGINX_PORT};
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include gzip.conf;
include proxy.conf;
include vhosts/*.conf;
}
EOF
cat > ${NGINX_HOME}/conf/gzip.conf <<EOF
gzip on;
gzip_min_length 2k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;#压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_proxied any;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on; #varyheader支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据
EOF
cat > ${NGINX_HOME}/conf/proxy.conf <<EOF
client_header_timeout 60;
client_body_timeout 60;
client_header_buffer_size 1m; #客户端请求头部的缓冲区大小
large_client_header_buffers 32 128k; #客户请求头缓冲大小
client_max_body_size 800m; #通过nginx上传文件的大小
client_body_buffer_size 1024k; #Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中
reset_timedout_connection on;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Accept-Encoding 'gzip';
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Origin '';
proxy_redirect http:// https://;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_connect_timeout 9000; #单位秒,后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_send_timeout 6000; #单位秒,后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout 6000; #单位秒,连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_ignore_client_abort on;
proxy_buffer_size 256k; #设置从被代理服务器读取的第一部分应答的缓冲区大小
proxy_buffers 4 256k; #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 100m; #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
proxy_temp_path ${NGINX_HOME}/proxy_temp; #proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_cache_path ${NGINX_HOME}/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=1g; #设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
EOF
mkdir -p ${NGINX_HOME}/conf/vhosts && mkdir -p ${NGINX_HOME}/proxy_temp && mkdir -p ${NGINX_HOME}/proxy_cache
#配置开机启动
cat > /usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStartPre=${NGINX_HOME}/sbin/nginx -t -c ${NGINX_HOME}/conf/nginx.conf
ExecStart=${NGINX_HOME}/sbin/nginx -c ${NGINX_HOME}/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
chown -R ${NGINX_USER}:${NGINX_GROUP} ${NGINX_HOME} && chmod -R 755 ${NGINX_HOME}
#启动nginx服务
action "*****启动nginx服务*****" /bin/true
systemctl daemon-reload
systemctl restart nginx.service
systemctl enable nginx.service
systemctl status nginx.service
echo -e "\033[33m************************************************完成nginx服务部署*************************************************\033[0m"
cat > /tmp/nginx.log <<EOF
nginx安装目录:${NGINX_HOME}
NGINX版本:NGINX-1.20.0
NGINX端口:${NGINX_PORT}
NGINX服务:systemctl status nginx
EOF
cat /tmp/nginx.log
echo -e "\e[1;31m 以上信息10秒后消失,保存在/tmp/nginx.log文件下 \e[0m"
echo -e "\033[33m*****************************************************************************************************************\033[0m"
echo ""
sleep 10
}
install_nginx_el7
脚本测试
测试结果如下