###################################################nginx安装#####################################################
一 . 安装nginx
-1 安装依赖:
yum install -y wget pcre pcre-devel openssl*
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2
libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl
curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap
openldap-devel nss_ldap openldap-clients openldap-servers make
yum -y install gd gd2 gd-devel gd2-devel
-2 创建www用户:
useradd -s /sbin/nologin www
-3 下载nginx
mkdir /data/softwate -p
cd /data/softwate
wget http://219.238.7.71/files/207700000B5FE966/nginx.org/download/nginx-1.13.9.tar.gz
tar zxvf nginx-1.13.9.tar.gz
cd nginx-1.13.9
./configure --prefix=/data/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre # 根据需要编译模块
make
make install
-4 启动nginx
/data/nginx/sbin/nginx
测试配置文件是否正确
/data/nginx/sbin/nginx -t
停止和reload
/data/nginx/sbin/nginx -s stop
#建议修改完配置文件以后都用 -t 参数测试一下,没有问题再reload
/data/nginx/sbin/nginx -s reload
# 查看已经编译的模块
/data/nginx/sbin/nginx -V (V 显示编译的参数,v显示nginx版本)
###################################################nginx模块的使用###################################################
-反向代理
-负载均衡
-防盗链
-健康检查
-状态信息
-日志轮转
-压缩
-
#####################################################nginx系统调优###################################################
- 1 针对IPV4的内核参数配置优化:将内核参数的值追加到linux系统的/etc/sysctl.conf 文件中,然后使用/sbin/sysctl -p命令是修改生效。
-(1) net.core.netdev_max_backlog :表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大
数目。默认值为128(不同的linux系统该数值也不同),建议将它的参数调整为262144
net.core.netdev_max_backlog = 262144
-(2) net.core.somaxconn:该参数用于调节系统同时发起的tcp连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,
可能导致链接 超过或者重传问题,建议设置该值为262144
net.core.somaxconn = 262144
-(3) net.ipv4.tcp_max_orphans:该参数用于设置系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字
,没有与用户文件句柄关联的TCP套接字将立即被复位,同时给出警告信息。这个限制只是为了防止简单的DOS
攻击,一般在系统内存比较充足的情况下,可以增大这个参数的赋值:
net.ipv4.tcp_max_orphans = 262144
-(4) net.ipv4.tcp_max_syn_backlog:该参数用于记录尚未收到客户端确认信息的链接请求的最大值。对于拥有128M内存的系统而言,此参数的
默认值是1024,最小内存的系统则是128。一般在系统内存比较充足的情况下,可以增加这个参数的赋值:
net.ipv4.tcp_max_syn_backlog = 262144
-(5) net.ipv4.tcp_timestamps:该参数用于设置时间戳,建议将其关闭。
net.ipv4.tcp_timestamps = 0
-(6) net.ipv4.tcp_synack_retries:该参数用于设置内核放弃TCP链接之前向客户端发送syn+ack包的数量,为了建立对端的连接,器
和客户端需要进行三次握手,第二次握手期间,内核需要发送syn并附带一个回应前一个syn的ack,这个参数
主要影响这个过程,一般赋值为1,即内核放弃连接之前发送一次syn+ack包,可以设置其为1
net.ipv4.tcp_synack_retries = 1
-(7) net.ipv4.tcp_syn_retries:该参数的作用与上一个参数类似,设置内核放弃建立链接之前发送syn包的数量,它的赋值和上个参数一样即可
net.ipv4.tcp_syn_retries = 1
- 2 针对cpu的配置优化:
- worker_processes : 用于设置nginx的进程数,建议设置为机器cpu的核心数相同
- worker_cpu_affinity: 用来为每个进程分配cpu的工作内核。如果一台机器的cpu是八核cpu,并且work_processes指令的值赋值为8,那么
worker_cpu_affinity的指令的设置可以是:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#####################################################nginx调优###################################################
1.设置nginx工作进程数(auto)
worker_processes 8;
nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
2.worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
3.worker_rlimit_nofile 102400;
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求
并不是那么均匀,所以最好与ulimit -n的值保持一致。
4.use epoll;
使用epoll的I/O模型,这个不用说了吧。
5.worker_connections 102400;
每个进程允许的最多连接数,理论上每台nginx的最大连接数为worker_processes*worker_connections。
6.keepalive_timeout 60;
keepalive超时时间。
7.client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,
所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
8.配置server缓存
open_file_cache max=102400 inactive=20s;
这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个
文件在inactive时间内一次没被使用,它将被移除。
nginx 配置文件优化
一.设置nginx工作进程数worker_processes cpu数(双核乘以2)
二.设置cpu亲缘性worker_cpu_affinity
三.设置nginx进程打开的最大文件描述符worker_rlimit_nofile(与ulimit -n的值一致)
四.设置epoll的IO模型 use epoll
五.设置每个进程允许的最多连接数 worker_connections 102400
六.设置keepalive超时时间keepalive_timeout 60;
七.设置客户端请求头的会缓冲区大下client_header_buffer_size 4k
八.设置server缓存
九.开启nginx压缩功能
十.设置静态文件的expires客户端缓存。
################################################# nginx配置文件解析###################################################
nginx.conf
user www; #定义Nginx运行的用户和用户组
worker_processes 4; #nginx进程数,建议设置为等于CPU总核心数
error_log logs/error.log error; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
#pid logs/nginx.pid;
#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求
# 并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;
events {
use epoll; #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
worker_connections 65535; #单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
#每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
}
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #隐藏nginx版本
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; #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。
#如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65; #keepalive超时时间。
#散列表的冲突率,默认1024,越大则内存消耗更多,但散列key的冲突率会降低,检索速度就更快
types_hash_max_size 2048;
gzip on; # 开启压缩功能
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,
include /data/nginx/conf/vhost/*.conf; #配置其他配置文件路径
}
设置子配置文件
1. 负载均衡的例子:
# 负载均衡upstream
upstream webservs{
ip_hash; #源地址转发解决session问题
server 192.168.1.120:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.1.120:82 weight=1 max_fails=2 fail_timeout=3;
#server 127.0.0.1:8066 weight=1 backup; # 定义备份server,当所有的服务不可用时,才启用,此处设置为本机的错误页!
}
# 定义开启缓存功能:磁盘文件地址 目录级别 内存区域 最大内存(将服务器的静态内容缓存到文件中)
proxy_cache_path /data/nginx/cache/first levels=1:2 keys_zone=first:20m max_size=1g;
# 可以设置多个缓存区
# proxy_cache_path /data/nginx/cache/two levels=1:2 keys_zone=two:20m max_size=1g;
server {
listen 80;
server_name www.a.com;
#charset utf-8;
#access_log logs/host.access.log main;
add_header X-Via $server_addr; # 定义header,名称为X-Via ,内容为服务器的ip地址
add_header X-Cache $upstream_cache_status; # 定义header 名称为X-chace 内容为缓存命中状态
location / {
# root html;
# index index.html index.htm;
proxy_pass http://webservs/; # 定义在主配置文件中 负载均衡
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#设置客户端缓存
location ~* \.(gif|jpg|png)$ {
expires 30d; # 图片和缓存30天
}
location ~* \.(css|js)$ {
expires 20m; # css,js缓存20分钟 1h 代表1小时
}
#这里配置的需要缓存的静态资源后缀名
location ~* "\.(jpg|jpeg|png|gif|html|css|js|woff2|woff|map)?$" {
proxy_pass http://webservs/;
proxy_cache first; #启用缓存,缓存的名字为first
proxy_cache_valid 200 24h; #200状态缓存24小时
proxy_cache_valid 302 10m; #302状态缓存10分钟
add_header X-Cache-Status $upstream_cache_status; #在http头部增加一个字段显示是否命中缓存
}
valid_referers none blocked www.a.com a.com; # 配置防盗链
if ($invalid_referer){
return 403;
}
}
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;
}
}
2. 反向代理的设置:
location /forum {
proxy_pass http://192.168.1.120; # 反向代理设置,注意120服务器上要有forum这个目录
# proxy_set_header X-Real-IP $remote_addr; #记录客户端ip,默认为代理服务器ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#############################################配置nginx日志轮转#######################################################
1. 新建nginx日志分割文件
vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
su root
daily
missingok
rotate 7
dateext
notifempty
create 0640 root root
compress
sharedscripts
prerotate
if [ -f /data/nginx/logs/nginx.pid ]; then
kill -USR1 'cat /data/nginx/logs/nginx.pid'
fi
endscript
参数解释:
home/wwwlogs/*nginx.log 需要轮询日志路径
daily: 日志文件分割频度。可选值为 daily,monthly,weekly,yearly
rotate 7: 一次将存储7个归档日志。对于第8个归档,时间最久的归档将被删除。
missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
dateext 使用日期作为命名格式
compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
nocompress: 如果你不希望对日志文件进行压缩,设置这个参数即可
delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。
这在你或任何软件仍然需要读取最新归档时很有用。
notifempty: 如果日志文件为空,轮循不会进行。
sharedscripts 表示postrotate脚本在压缩了日志之后只执行一次
create 644 www root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript: 最通常的作用是让应用重启,以便切换到新的日志文件, 在所有其它指令完成后,postrotate和endscript里面指定的命
令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
2. 运行logrotate
使用指令: logrotate/etc/logrotate.d/nginx # 没有任何显示
3. 测试日志切割
使用指令: logrotate -d /etc/logrotate.d/nginx
4.强制轮询切割日志
使用指令: logrotate -vf /etc/logrotate.d/nginx
参考文档:https://zhuanlan.zhihu.com/p/24880144