常用地址
官网:nginx
下载地址(选择Stable version 下的也就是稳定版本): http://nginx.org/en/download.html
安装步骤
#下载地址(选择Stable version 下的也就是稳定版本)
http://nginx.org/en/download.html
#上传tar包到liunx上
rz -bye
#解压tar包
tar xvf nginx-1.26.2.tar.gz
#进入安装目录
cd /root/nginx-1.26.2
#安装nginx需要的依赖
yum -y install pcre yum -y install openssl openssl-devel yum -y install gd-devel
#编译前的配置和依赖检查
./configure --user=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --without-http_rewrite_module
#编译安装
make install
#进入默认安装路径
cd /usr/local/nginx/sbin
#添加nginx用户
sudo useradd -s /sbin/nologin -M nginx
#启动nginx
./ nginx
#查看是否有返回
curl http://localhost:80
#查看版本
./ nginx -v
常用命令
进入到安装默认路径下
cd /usr/local/nginx/sbin
./nginx #启动nginx
./nginx -t #在不启动nginx的情况下,使用-t参数测试配置文件是否有错误
./nginx -v #查看版本信息
./nginx -s stop #强制停止nginx服务
./nginx -s quit #优雅的停止服务
./nginx -s reopen #日志文件回滚
./nginx -s reload #重新加载配置文件
配置
这些配置项都是用于调试测试的配置
1 daemon on|off; 是否以守护进程方式运行nginx(默认为 on )守护进程(daemon)是脱离终端并且在后台运行的进程,不过nginx还提供了关闭守护进程模式,为了方便跟踪调试nginx。
2 master_process on|off; 是否以master/worker方式工作(默认为 on )nginx是以一个master进程管理多个worker进程的方式运行的,如果关闭了master_process方式,就不会fork出worker字进程来处理请求,而是用master进程自身来处理请求。
3 error_logpathfile level; error日志的设置 (默认为 error_log logs/error.long error);我们可以根据自己需求设置error日志的路径和级别,pathfile参数可以是一个具体文件,默认是logs/error.log文件,最好将它放在磁盘足够大的位置,pathfile也可以 /dev/null,这样就不会输出任何日志了,这也是关闭error日志的唯一手段;pathfile也可以是stderr,这样日志会输出到标准错误文件中。 level是日志的输出级别,取值范围是dedug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大。当设定为一个级别时,大于或等于该级别的日志都会被输出到pathfile文件中,小于该级别的日志则不会输出。如果日志级别设定到debug,必须在configure时加入 --with-debug配置项。
4 debug_points[stop|abort] 是否处理几个特殊的调试点这个配置项是帮助用户跟踪调试nginx的,它接受两个参数:stop和abort;如果设置为stop那么nginx的代码执行到这些调试点时就会发出SIGSTOP信号用于调试,如果设置为abort则会产生一个coredump文件,可以用gdb来查看nginx当时的各种信息。 通常不会使用这个配置。
5 debug_connection[IP|CIDR] 仅对指定的客户端输出debug级别的日志这个配置属于事件类配置,它必须放在events{}中才有效,它的值可以是IP地址或者CIDR地址;例如
events{
debug_connection 10.224.66.14;
debug_connection 10.224.57.0/24;
}只有来自以上IP地址的请求才会输出debug级别的日志,该配置确保已在configure时已加入--with-debug参数。
6 worker_rlimit_core size;限制coredump核心转储文件的大小在linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心影像)写入一个文件(core文件),以作为调试之用。如果不加以限制,那么可能一个core文件会达到几GB,通过worker_rlimit_core可以限制core文件的大小。
7 working_directory path; 指定coredump文件生成目录这个配置唯一用途就是设置coredump文件所放置的目录,因此需确保worker进程有权限向working_directory 指定的目录中写入文件。
配置项是正常运行的配置
3.8 env VAR|VAR=VALUE 定义环境变量可以让用户直接设置操作系统上的环境变量。 例如:env TESTPATH=/tmp/;
3.9 includepathfile; 嵌入其他配置文件 include配置项可以将其他配置文件嵌入到当前的nginx.conf文件中,它的参数可以是绝对路径,也可以是相对路径 (相当于nginx的配置目录,即nginx.conf所在目录); 例如:include mime.types;include vhost/*.conf;
3.10 pid path/file; pid文件的路径(默认为 pid logs/nginx.pid;);保存master进程ID的pid文件存放路径。默认与configure执行时的参数 --pid-path 所指定的路径是相同的,也可随时修改,但应确保nginx有权在相应的目标中创建pid文件,该文件直接影响nginx是否可以运行。
3.11 user username[groupname]; Nginx worker进程运行的用户及用户组(默认为 user nobody nobody;);user用于设置master进程启动后,fork出的worker进程运行在哪个用户和用户组下,当按照 user username 设置时,用户组名和用户名相同。若用户在configure命令执行时使用了参数 --user=username和 --group=groupname 此时nginx.conf将使用参数中指定的用户和用户组。
3.12 worker_rlimit_nofile limit; 指定Nginx worker进程可以打开的最大句柄描述符个数。
3.13 worker_rlimit_sigpending limit; 限制信号队列设置每个用户发往Nginx的信号队列大小。也就是说,当某个用户的信号队列满了,这个用户再发送的信号会丢掉。
优化性能的配置项
3.14 worker_processes number; Nginx worker进程个数 (默认为: 1)
3.15 worker_cpu_affinity cpumask[cpumask] 绑定Nginx worker进程到指定的CPU内核绑定worker进程到指定的CPU内核,每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发。解决了同步问题。例如:如有4颗CPU内核,设置如下worker_processes 4;worker_cpu_affinity 1000 0100 0010 0001;
3.16 ssl_engine device; SSL硬件加速对SSL进行配置加快SSL协议的处理速度查看命令为:openssl engine -t
3.17 timer_resolution t; 系统调用gettimeofday的执行频率如果希望日志文件中每行打印的时间更准确,可以使用。否则其它情况下可以不用配置
3.18 worker_priority nice; Nginx worker进程优先级设置(默认为: worker_priority 0)
优先级由静态优先级和内核根据进程执行情况所做的动态调整(目前只有土5的调整)共同决定。nice值是进程的静态优先级,取值范围是-20~+19,-20是最高优先级,+19是最低优先级。因此Nginx需要占用更多的系统资源,可以把nice值配置的更小一些,但不建议比内核进程的nice值(通常为-5)还要小。
事件类配置项
3.19 accept_mutex[on|of] 是否打开accept锁 (默认为: on);accept_mutex是Nginx的负载均衡锁,该锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP链接。accept锁是默认打开的,如果关闭它,那么建立TCP链接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭它。
3.20 lock_file path/file; lock文件的路径(默认是: lock_file logs/nginx.lock);accept锁配置打开时 lock_file配置才会生效。
3.21 accept_mutex_delay Nms; 使用accept锁后到真正建立连接之间的延迟时间(默认为: 500ms);accept锁打开后,同一时间只有一个worker进程能够取到accept锁,这个accept锁不是阻塞锁,如果取不到会立刻返回。如果worker进程没有取到accept锁,需要等accept_mutex_delay定义的时间间隔后才能再次取锁
3.22 multi_accept[on|off]; 批量建立新连接 (默认为: off);当事件模型通知有新连接时,尽可能地对本次调度中客户端发起的所有TCP请求都建立连接。
3.23 use[kqueue|rtsig|epoll|dev|poll|select|poll|eventport]; 选择事件类型 (默认:Nginx会自动使用最合适的事件模型);对Llnux操作系统来说,可供选择的事件驱动模型有poll、select、epoll三种,epoll是性能最高的一种(可以处理大并发连接)。
3.24 worker_connections number; 每个worker的最大连接数定义每个worker进程可以同时处理的最大连接数
日志文件备份(自己编写)
自己编写脚本名称: backupsLog.sh
1.在linux中添加定时任务执行命令: crontab -e
2.定时时间: */1 * * * * sh /data/backupsLog.sh # 每一分钟执行一次该文件
3.脚本内容如下:
LOGPATH=/usr/anzhuanglujing/nginx/logs #日志文件的存储路径
BASEPATH=/home/$(date -d yesterday +%Y%M) ##备份日志文件的存储路径(按照年月文件夹存储)
mkdir -p $BASEPATH #创建备份的文件夹
bak=$BASEPATH/$(date -d yesterday +%M%d)text.log #备份日志文件的名称和格式
mv $LOGPATH $bak #把原日志文件移动到备份文件夹下并修改日志名称和格式
touch $LOGPATH #在原有日志路径下重写一个新的日志文件
kill -USR1 `cat usr/anzhuanglujing/nginx/logs/nginx.pid` #重启linux服务
nginx配置文件(nginx.conf)中的 location执行流程
1. 得到前端地址栏URL。
2. 判断精准(=)是否命中,如果命中,立即返回结果并结束解析过程。
3. 判断普通是否命中,如果有多个命中,记录下来最长的命中结果。备注:记录但不结束,最长的为准
4. 判断正则表达式(~)的解析结果,按照配置里的正则表达式顺序为准,由上到下开始匹配,一旦有匹配结果立即结束,并结束解析过程。
备注: 1 普通匹配:没有顺序,因为是按命中的长短确定的。
2 正则表达式:是有序匹配,因为是从前往后命中的。
rewrite 重写
常用命令:
if(条件){} 设定条件,进行重写
set 设置变量
return 返回状态码
break 跳出rewrite
rewrite重写
gzip压缩 配置的常用参数
gzip on|of; #是否开启gzip
gzip_buffers 32 4K | 16 8K #缓冲(压缩在内存中缓冲几块,每块多大)
gzip_comp_level [1-9] #压缩级别(级别越高,压的越小但浪费CPU计算资源) 推荐6
gzip_disable #什么样的URL不进行gzip 正则匹配UA
gzip_min_length 4000 #开始压缩的最小长度(比如小于4KB时将不再压缩)
gzip_http_version 1.0 | 1.1 #开始压缩的http协议版本(可以不设置)
gzip_proxied #设置请求者代理服务器该如何缓存内容
gzip_types text/css text/xml appliction/x-javascript; #设置需要压缩文件的类型 (比如:css、js、xml等)
gzip_vary on | off; #是否开启gzip压缩标志
备注: 图片、mp3、二进制文件不必压缩,因为压缩率较小,而且需要注意的是压缩是非常耗费CUP资源的。
expires缓存配置
备注:
1、服务器的日期要准确,如果服务器的日期落后于实际日期,会造成换成失败。
2、304也是一种很好的缓存手段。
3、原理是:服务器响应文件内容时同时响应etag标签(内容的签名、内容一变,它也变)和last_modified_since标签值
4、浏览器下次请求时,头信息会发送这连个标签,服务器检测文件有没有发生变化,如果没有发生变化直接头信息返回etag标签和last_modified_since标签
5、浏览器查看内容无变化,直接调用本地缓存。
6、对于变化周期较短的,比如静态html、js、css等比较适合。
代码实现:
写在location或if段里面
expires 30s; 30秒过期
expires 30m; 2分钟过期
expires 30h; 2小时过期
expires 30d; 30天过期
nginx实现反向代理和负载均衡
1、反向代理(也叫动静分离)的实现方式: 使用关键字:proxy_pass
#使用反向代理
location ~ \.php$ { #~(波浪号)是正则匹配
proxy_pass http://127.0.0.1:8080; #只是单台机器
}
2、负载均衡的实现方式: 使用关键字:upstream (把多台机器绑定在一起并起一个组名)
#负载均衡的配置
#参数介绍:
# 1、test:负载均衡的组名
# 2、weight(权重): 配置的权重越高,该机器被访问的就越多;默认配置为 1
# 3、max_fails: 连接失效次数
# 4、fail_timeout:连接失效时间(秒)
upstream text{
server localhost:81 weight=1 max_fails=2 fail_timeout=3; #配置的第一台机器
server localhost:82 weight=1 max_fails=2 fail_timeout=3; #配置的第二台机器
}
#负载均衡配置的 第一台机器
server {
listen 81; #监听端口
server_name localhost; #监听域名
root html;
access_log /logs/81-access.log main; #存储本台机器的日志文件路径
}
#负载均衡配置的 第二台机器
server {
listen 82; #监听端口
server_name localhost; #监听域名
root html;
access_log /logs/81-access.log main; #存储本台机器的日志文件路径
}
#使用负载均衡
location ~ \.php$ { #~(波浪号)是正则匹配
proxy_set_header X-Forwarded-For $remote_addr; #给负载均衡的机器传递前端访问的IP地址
proxy_pass http://test; #多台机器使用 组名(负载均衡)
}
#备注:负载均衡默认的算法:根据后端配置的服务器顺序逐个请求。也可以使用第三方一致哈希性算法模块(第三方算法有很多,根据自己的服务器寻找合适的)
整体集群搭建
搭建思路:
1、总共有4台服务器分别为: A(硬盘比较大)、B(内存比较)、C(内存比较大)、D(内存比较大)
2、硬盘比较大的适合做 数据库服务器(A)
3、内存比较大做 Nginx和缓存服务器(B)
4、内存比较大做 java服务(C)
5、内存比较大做 内存缓存 比如memcached(D)
高并发调优思路(单台nginx)
备注:高并发其实就是指服务器能打开多少个 Socket 和 文件;
1、Socket
1.1 系统服务器设置:1.1.1 最大连接数somaxconn;a.查看当前机器打开Socket的连接数命令: more /proc/sys/net/core/somaxconn; b.设置当前机器打开Socket的连接数命令 (设置为5万个): echo 50000 > /proc/sys/net/core/somaxconn(该命令临时有效,机器重启后失效);1.1.2 加快TCP连接的回收 tcp_tw_recycle;a.查看TCP是否快速回收命令(0否): cat /proc/sys/net/ipv4/tcp_tw_recycle; b.设置TCP快速回收命令(设置为1是):echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle (该命令临时有效,机器重启后失效);1.1.3 空的TCP是否允许回收利用 tcp_tw_reuse;a.查看TCP是否回收利用命令: cat /proc/sys/net/ipv4/tcp_tw_reuse;b. 设置TCP回收利用命令: echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse(该命令临时有效,机器重启后失效);1.1.4 洪水攻击 禁止洪水抵御;a.查看是否设置为洪水抵御命令:(1是) more /proc/sys/net/ipv4/tcp_syncookies;b.设置为禁止洪水抵御命令:(0否)echo 1 > /proc/sys/net/ipv4/tcp_syncookies;
1.2 nginx:a. nginx的子进程能打开Socket的连接数 worker_connections (在nginx.conf配置文件中)
events {
worker_connections 10240; #设置成1万个
}b. 设置nginx每个 TCP 连接最多可以保持多长时间(默认65秒): keepalive_timeout 60;
2、文件
2.1 系统服务器配置:a. 查看每个进程可打开的文件数命令(默认为1024): ulimit -n;b. 设置每个进程可打开的文件数命令(设置为5万): ulimit -n 50000 (临时有效,重启失效);
2.2 nginx: nginx的子进程允许打开的文件数:在nginx.conf配置文件中加入(在全局区域): worker_limit_nofile 10000;
配置文件
#以下内容是nginx.conf配置文件内容,供参考使用
/usr/local/nginx/conf/nginx.conf #配置文件默认路径
# 全局区域 作用:主要会设置一些影响nginx服务器整体运行的配置指令,包括配置运行nginx服务器的用户(组)、允许生成worker_processes(服务器并发处理数)、进程PID存放路径、日志存放路经和类型、配置文件的引入等
#user nobody;
#处理并发数(根据机器的内核和CPU设置,比如4核机器,设置为4)
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# events区域 作用:该模块涉及的指令主要影响nginx服务器与用户的网络连接,常用的配置项有:是否开启对多worker_process下的网络连接进行序列化、是否允许同时接收多个网络连接、选取事件驱动模型来处理请求、每个worker_process可以同时支持的最大连接数等;
events {
# nginx最大连接数
worker_connections 1024;
}
#http区域 作用:文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等
http {
#引入nginx支持的文件类型
include mime.types;
#当nginx遇到不支持的文件类型时,以8进制的形式返回给前端
default_type application/octet-stream;
#这是main的日志格式,mian类型的选项有:
#1、$remote_addr: 远程IP地址
#2、$remote_user [$time_local]: 远程用户访问的时间
#3、$request: 请求方式
#4、$status: 请求状态
#5、$body_bytes_sent: 主题字节
#6、$http_referer: 上一个页面来自哪里
#7、$http_user_agent: 用户代理
#8、$http_x_forwarded_for:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#负载均衡的配置
#参数介绍:
# 1、test:负载均衡的组名
# 2、weight(权重): 配置的权重越高,该机器被访问的就越多;默认配置为 1
# 3、max_fails: 连接失效次数
# 4、fail_timeout:连接失效时间(秒)
upstream text{
server localhost:81 weight=1 max_fails=2 fail_timeout=3; #配置的第一台机器
server localhost:82 weight=1 max_fails=2 fail_timeout=3; #配置的第二台机器
}
#server区域 该区域和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是一样的,该技术的产生是为了节省互联网服务器硬件成本,每个http区域可以包含多个server区域,每个server区域相当于一个虚拟主机,而每个server区域包含可以包含多个location区域
#server区域 作用:配置本虚拟主机的监听、名称、IP配置
#负载均衡配置的 第一台机器
server {
#监听端口
listen 81;
#主机名称
server_name localhost;
root html;
access_log /logs/81-access.log main; #存储本台机器的日志文件路径
}
#负载均衡配置的 第二台机器
server {
listen 82; #监听端口
server_name localhost; #监听域名
root html;
access_log /logs/81-access.log main; #存储本台机器的日志文件路径
}
server { #server区域,基于域名的虚拟主机
listen 80; #监听端口
server_name localhost; #监听域名
#gzip压缩的配置(在改位置配置表示全局有效)
gzip on; #是否开启gzip
gzip_buffers 32 4K; #缓冲(压缩在内存中缓冲几块,每块多大)
gzip_comp_level 6; #压缩级别(级别越高,压的越小但浪费CPU计算资源) 推荐6
gzip_min_length 4000; #开始压缩的最小长度(小于改字节时将不再压缩)
gzip_types text/css text/xml appliction/x-javascript; #设置需要压缩文件的类型 (比如:txt、xml、html、css等)
#charset koi8-r;
#access_log logs/host.access.log main; #该server段访问的日志路径是logs/host.access.log 日志格式是main,
# localhost区域 作用:基于nginx服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理,地址定向,数据缓存和应答控制等,还有许多第三方模块的配置也在这里进行
#配置规则 1.首先查看有没有精准匹配,如果有,则停止匹配过程
location / { #定位,把特殊的路径或文件再次定位,如image目录单独处理
#使用 rewrite(重写) 判断不存在的地址时,跳转到自己配置的错误地址
if (!-e $document_root$fastcgi_script_name){
rewrite ^.*$ /404.html;
break;
}
root html; #根目录定位
index index.html index.htm;
}
#缓存配置 使用正则表达式匹配以下格式(~*)不区分大小写 如果命中,就缓存1天
location ~* \.(jpg|jpeg|gif|png) {
expires 1d; #缓存一天
}
#使用反向代理 或者 负载均衡
location ~ \.php$ { #~(波浪号)是正则匹配
proxy_set_header X-Forwarded-For $remote_addr; #给负载均衡的机器传递前端访问的IP地址(负载均衡)
proxy_pass http://127.0.0.1:8080; #单台机器(反向代理)
proxy_pass http://test; #多台机器使用 组名(负载均衡)
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html { #=(等于号)是精准匹配
root html;
}
#
#location php$ { #没有任何符号是一般匹配
# proxy_pass http://127.0.0.1;
#}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #~(波浪号)是正则匹配
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}