web服务器___nginx全攻略
一、安装nginx
1、安装依赖包
yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++,其中pcre库是perl兼容正则表达式库,用于支持rewrite模块
2、配置并安装nginx
安装nginx版本为1.6.3,配置选项如下:
./configure --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --prefix=/application/nginx-1.6.3/
查看所有可用配置选项使用如下命令:
./configure --help
编译安装nginx:make&&make install
3、创建连接
ln -s /applicattion/nginx-1.6.3 /application/nginx
二、配置文件介绍
1、nginx常用模块介绍
1)核心功能模块
ngx_core_module 对应配置文件中为main区块和events区块,是配置nginx全局参数的地方,其中main区块指的就是配置文件最上面没有被任何括号包裹的那些配置项。
2)标准http功能模块
ngx_http_core_module 核心HTTP参数配置,对应http区块
ngx_http_access_module 访问控制模块
ngx_http_gzip_module 压缩模块
ngx_http_fastcgi_module fastcgi模块,与动态应用相关如PHP
ngx_http_proxy_module 代理模块
ngx_http_upstream_module 负载均衡模块,可实现网站负载均衡与健康检查
ngx_http_rewrite_module URL地址重写
ngx_http_limit_conn_module 限制用户并发连接数与请求数
ngx_http_limit_req_module 根据定义的key限制nginx请求过程的速率
ngx_http_log_module 访问日志模块,可自定义日志格式
ngx_http_auth_basic_module web认证模块,设置nginx用户通过账号密码访问
ngx_http_ssl_module ssl模块,用于加密HTTP连接如https
ngx_http_stub_status_module 记录nginx基本访问状态信息
2、主配置文件常规参数说明
main区块,配置文件最开头没有大括号包裹的内容
user nginx运行用户
worker_processes nginx开启的worker进程数,一般设置为与CPU内核数相等,worker进程用于建立连接
error_log 错误日志的路径
pid pid文件的路径
include 用于加载配置文件,可以用于其他模块中
events模块
worker_connections 单个worker进程的最大连接数
http模块
log_format 访问日志的记录格式与记录格式的名字
access_log 访问日志的路径
types_hash_max_size hash表占用的内存最大值
default_type 默认媒体类型
server模块,配置在http模块中,用于定义网站相关参数
listen nginx监听的IP和端口
server_name 网站的域名
location 用于匹配访问路径做响应的处理
root 用于定义网站的根目录
index 用于指定网站首页路径
error_page 用于指定http错误的错误页路径 ,可以将多个http错误指定到同一个错误页的路径下
三、nginx配置虚拟主机
nginx配置虚拟主机有三种方法,依次如下:
1、基于域名,常用于外网网站
1)修改server模块中的server_name参数为网站对应的域名
2)在server模块中添加一条location语句,指定网站的根目录路径,如location / { root html/blog },其中location匹配的/即代表nginx的安装目录路径,root参数指定的路径就是从nginx安装路径开始的网站的根目录路径,如果nginx安装路径为/application/nginx/,则该网站的根目录路径为/application/nginx/html/blog/
3)在公网DNS服务器添加该网站的域名解析记录
2、基于端口,常用于内网网站或公网网站的后台
1)修改server模块的listen参数的端口设置,如listen 81;listen 172.16.1.41:81,不同的相同IP下的不同端口对应不同网站
2)添加location记录,配置网站根目录
3、基于IP,一般不用
1)修改server模块的listen参数的IP设置,如listen 172.16.1.41:80;listen 172.16.1.31:80
2)添加location记录,配置网站根目录
注:1、企业中通常将所有server模块配置在一个单独的文件中,然后在主配置文件中用include参数加载,同时删除主配置文件中的其他的server模块的配置
2、在配置基于域名的虚拟主机时还可以配置别名,即在server_name参数中配置多个域名以空格分隔
3、在虚拟主机中启用状态模块需要添加一条虚拟主机配置,添加如下的location语句:location / { stub_status on;access_log off; }
四、nginx日志配置
1、错误日志
错误日志的配置遵循如下格式:error_log 错误日志文件路径 记录的错误级别;,
错误级别一般设置为error,错误日志一般设置在main模块中以统一记录所有错误信息
2、访问日志
访问日志的配置遵循如下格式:access_log 访问日志路径 日志记录格式的名字;
访问日志的记录格式配置格式如下:log_format 名字 记录格式
访问日志一般在server模块中配置,访问日志记录格式一般在http模块配置
记录格式中有如下参数可以使用:
$remote_addr 访问网站的客户端IP
$http_x_forwarded_for 当web服务器前端有代理服务器时,让web服务器记录访问的客户端IP,该配置生效需要在代理服务器上做如下配置:proxy_set_header X-Forwarded-For $remote_addr;
$remote_user 客户端用户名称
$time_local 记录访问时间与时区
$request 用户的http请求起始行信息
$status http状态码,记录请求返回的状态
$body_bytes_sents 服务器发给客户端的响应body字节数
$http_referer 记录此次请求是从哪个链接跳转过来的
$http_user_agent 记录客户端访问信息
五、nginx日志轮询切割
由于nginx没有现成的工具做日志切割,因此需要编写脚本并设置定时任务来完成这项工作,脚本编写如下:
cat>>/server/scripts/cut_nginx_log.sh<<EOF
cd /application/nginx/logs/
#Cut access log
/bin/mv www_access.log www_access-$(date %F -d -1day).log
#Reload nginx
/application/nginx/sbin/nginx -s reload
#Push access log to the backup server
rsync -az /application/nginx/logs/ rsync_backup@172.16.1.41::nginxbackup --password-file=/etc/rsync.password &
#Delete more than seven days of log
find /application/nginx/logs/ -type f -mtime +7 -name 'www_access-*.log' -delete
EOF
定时任务编写如下:
crontab -e
#cut nginx log write by liufeng 2018-3-16
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh>/dev/null 2>&1
六、nginx的location写法
格式:location uri { 处理动作 }
uri 访问的资源路径
location匹配uri时的特殊符号:
= 精确匹配
~ 区分大小写
~* 不区分大小写
^~ 不做正则匹配
@ 内部调用
location匹配uri时支持正则表达式,同时匹配有如下规律:
1、等号最优先匹配如location = /
2、其次匹配^~如location ^~ /image/
3、再匹配正则如location ~* \.(gif|jpg|jpeg)$
4、匹配常规字符串,有正则优先匹配正则如location /documents/
5、最后匹配默认location /
七、nginx的rewrite写法
格式:rewrite 正则规则 替换内容 [标记]
例如:rewrite ^/(.*)$ http://www.baidu.com/$1 permanent
rewrite可用的标记有以下四种:
last 本规则匹配完成后,继续向下匹配新的location URI规则
break 本条规则匹配完即中止,不再匹配后面的任何规则
redirect 返回302临时重定向
permanent 返回301永久重定向
八、nginx配置访问认证
auth_basic ""; 弹窗上的提示信息
auth_basic_user_file /application/nginx/conf/htpasswd; 认证文件的路径
htpasswd -cb /application/nginx/conf/htpasswd oldboy 123456 创建认证文件,用户名old,密码123456,htpasswd工具由httpd服务安装产生
可以配置在http区块,server区块或location语句中
九、nginx连接PHP配置
server {
listen 80;
server_name blog.etiantian.org;
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
十、nginx反向代理
http {
....
upstream 节点池名称 {
ip_hash; #会话保持,让相同的客户端始终访问同一台服务器
server 10.0.0.9:80 weight=1; #weight表示负载均衡中的权重
server 10.0.0.10:80 weight=1;
server {
....
location / {
.....
proxy_pass http://节点池名称; #将访问请求转发给节点池中的服务器
proxy_set_header Host $host; #使用客户端访问请求中的域名向后端web服务器发起请求
proxy_set_header X-Forwarded-For $remote_addr; #将客户端的IP转发给web服务器
}
}
}
}
十一、nginx优化
nginx的优化分为性能优化和安全优化两部分,优化操作如下:
1、性能优化
1)修改worker进程数量
worker进程是nginx用于建立与客户端连接的,worker进程数量越多nginx可以建立的连接越多,但也不是越多越好,一般设置为与CPU核数相等即可,具体操作为修改main区块的worker_processes参数,将其设置为与CPU核数相等。如:worker_process 4
查看CPU核数的方法有以下三种:
1、grep -c 'processor' /proc/cpuinfo
2、grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l,该方法看到的是CPU的颗数
3、在top命令界面下,按数字1即可看到CPU核数
2)将不同nginx进程绑定到不同CPU核心上,充分利用CPU资源
nginx运行中有时会将很多连接交给正在处理任务的CPU核心上而浪费CPU资源,因此如下做这步优化,下面是四核CPU的操作方法,核心更多的CPU方法类似:worker_cpu_affinity 0001 0010 0100 1000;
3)修改nginx事件处理模型
常用的TCP连接处理模型有select模型和epoll模型,这两个都是I/O多路复用模型即软件主程序不需要关心TCP连接是否就绪,只需要对就绪的连接进行相应的处理,而连接是否已就绪则有专门的监听任务去处理,监听任务会监测哪些TCP连接已经就绪可以往该连接发送数据或接收该连接中的数据,然后将这样的已就绪连接返回给软件主程序处理。而epool模型比select模型高效的原因就在与监测任务如何知道连接是否就绪的方式上epoll模型采用的是主动通知的方式,即系统内核会将已就绪的连接告诉epoll监测任务,而select模型则需要自己一个一个查看该连接是否已就绪。因此需要将nginx的事件处理模型修改为epoll模型,具体操作为在events区块中使用use参数指定事件模型为epoll。如:events { use epoll; }
4)调整单个worker进程的最大连接数
该优化步骤的操作为修改events区块中的worker_connections参数,将该参数设置为(nginx最大处理连接数/worker进程的数量)的结果。如:events { worker_connections 4096; }
5)调整worker进程最大能够使用的文件描述符数量
文件描述符是系统用于访问文件的依据,每创建一个文件都要消耗一个文件描述符,而nginx运行过程中需要创建很多文件,比如日志文件、pid文件、socket文件等等,因此需要让nginx能够尽可能多的使用文件描述符,避免因为可用文件描述符不足而报错,具体操作为在main区块中用worker_rlimit_nofile参数指定。如worker_rlimit_nofile 65535;
6)开启文件高效传输模式
开启nginx的sendfile参数可以使文件传输更快,一般会配置tcp_nopush和tcp_nodelay参数一起使用,tcp_nopush允许把http response header和文件的开始放在一个文件发布,减少网络报文段的数量,tcp_nodelay让nginx在积累一定量的数据之后再发送。具体操作如下:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
7)nginx超时相关设置
设置超时能够让nginx适时的抛弃那些耗时过长的任务转而处理新的任务,可以提高任务处理效率。具体操作如下:
http {
keepalive_timeout 60; 连接超时时间,保持连接的最大时间
client_header_timeout 15; nginx读取客户端请求头信息的超时时间
client_body_timeout 15; nginx读取客户端请求体信息的超时时间
send_timeout 25l nginx响应客户端的超时时间
}
8)限制上传文件大小
上传文件太大会占用过多的带宽,延长传输时间,因此需要限制客户端上传文件的大小,具体操作如下:
http {
client_max_body_size 8m;
}
9)FastCGI相关优化
由于nginx与php解释程序通过FastCGI传递数据,因此需要优化相关的buffer和cache的设置,具体操作如下:
location / {
fastcgi_connect_timeout 240; nginx连接fastcgi的超时时间
fastcgi_send_timeout 240; fastcgi服务端返回数据的超时时间
fastcgi_read_timeout 240; nginx从fastcgi服务端读取响应信息的超时时间
fastcgi_buffer_size 64K; nginx读取从fastcgi服务端收到的第一部分响应信息的缓冲区大小
fastcgi_buffers 4 64K; 缓冲区数量与大小
fastcgi_busy_buffers_size 128K; fastcgi忙时buffer的大小
fastcgi_temp_file_write_size 128K; fastcgi临时文件大小
fastcgi_cache oldboy_nginx; 开启fastcgi缓存并指定名称
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g fastcgi_cache缓存目录
fastcgi_cache_valid 200 302 1h;(301 1d any 1m) 应答代码缓存时间
fastcgi_cache_min_uses 1; 请求几次后缓存
fastcgi_cache_use_stale error timeout invalid_header http_500; 哪些情况使用过期缓存
fastcgi_cache_key http://$host$request_uri; 定义fastcgi_cache的key
}
10)压缩优化
启用gzip压缩模块对网页元素进行压缩,以加快用户打开网页的速度,同时减少带宽消耗,具体操作如下:
http {
gzip on; 开启gzip压缩
gzip_min_length 1K; 启用压缩的文件最小大小
gzip_buffers 4 32K; gzip压缩的buffer个数和大小
gzip_htto_version 1.1; 使用的gzip版本
gzip_comp_level 9; 压缩的级别
gzip_types text/css text/xml application/javascript; 指定需要压缩的文件类型
gzip_vary on; 允许缓存服务器缓存nginx压缩后的页面
}
11)缓存优化
企业网站的网页元素可能很长时间都不会更换,因此当第一次客户端从网站将这些元素下载下来之后应该将这些内容保存一定时间,这样既可以加快用户打开网页的速度,也可以节省企业的带宽,具体操作就是启用nginx的expires缓存,如:location ~ .*\.(gif|jpg|jgeg|png|bmp|swf)$ {
expires 3650d; #将所有的图片元素缓存10年
}
expires缓存虽然有很多好处,但是也有一个问题即当网站有更新而缓存没有到期用户就无法获取网站最新的内容,解决这个问题有两个方法:
1、经常更新的元素将缓存时间设置的短一点
2、将更新的元素的名字修改为新的文件名
12)日志优化
2、安全优化
1)隐藏nginx版本号
由于软件都会存在漏洞,而不同版本的nginx的漏洞是不同的,如果让攻击者知道了服务器上nginx的版本号就能利用特定的漏洞攻击服务器,因此必须隐藏nginx的版本号,具体操作就是在http区块中加上如下配置:server_tokens off;
2)更改默认用户
nginx的运行用户如果权限过大,当攻击者取得nginx的控制权就会获得很大的服务器操作权限,因此运行nginx的用户必须权限最小化,具体操作就是修改main区块中user参数,将运行用户设置为普通用户。如:user nginx;

浙公网安备 33010602011771号