Nginx
1.编译安装nginx
编译安装nginx 必须先安装pcre库。
(1)uname -a 确定环境
Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
(2)yum install -y pcre pcre-devel -y 必须安装pcre库(实现nginx rewrite模块功能 rewrite企业必须用到的)
yum install -y openssl openssl-devel(安装openssl-devel模块)
(3)检查安装结果
rpm -qa pcre pcre-devel
pcre-7.8-7.el6.x86_64
pcre-devel-7.8-7.el6.x86_64
rpm -qa openssl openssl-devel
openssl-devel-1.0.1e-15.el6.x86_64
openssl-1.0.1e-15.el6.x86_64
(4)下载nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.4.4.tar.gz
tar -xvzf nginx-1.4.4.tar.gz
cd nginx-1.4.4
(5)安装Nginx
这里nginx安装路径统一安装在/usr/local/nginx下
创建nginx 用户及组
useradd -s /sbin/nologin -M
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre
make && make install
解释:prefix 指定安装路径
--user=nginx 进程用户权限
--group=nginx 进程用户组权限
--with(安装各种模块)如:--with-http_stub_status_module enable ngx_http_stub_status_module\ 安装模块并计划nginx状态信息。
检查配置语法:
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
启用nginx
/usr/local/nginx/sbin/nginx
检查启动
netstat -lnt|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
pgrep nginx
54470
54471
lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
clock-app 2768 root 21u IPv4 72431 0t0 TCP 192.168.1.105:53173->111.108.54.43:http (ESTABLISHED)
nginx 54470 root 6u IPv4 62562 0t0 TCP *:http (LISTEN)
nginx 54471 nginx 6u IPv4 62562 0t0 TCP *:http (LISTEN)
ps -aux|grep nginx
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 54470 0.0 0.0 24264 788 ? Ss 11:33 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 54471 0.0 0.1 24664 1344 ? S 11:33 0:00 nginx: worker process
root 57878 0.0 0.0 103260 848 pts/1 S+ 11:39 0:00 grep nginx
检查启动效果
cur 127.0.0.1
或者浏览器直接访问查看效果或者用wget也可以:wget 127.0.0.1
nginx启动报错简单问题汇总
(1)nginx:[emerg]getpwnam(“nginx”)failed
没有创建nginx服务用户导致,useradd nginx -s /sbin/nologin -M即可。
(2)编译安装pcre 时gcc不全导致报错,提示yum源不存在这个作为补充。
如:make && make install
make [1]*** [pcrecpp.lo]错误
make [1] leaving directoy `home/gilin/tools/pcre-8.30`
执行:yum install -y gcc-c++ 即可解决
(3)如何查看nginx编译时的参数
/usr/local/nginx/sbin/nginx -V
(4)浏览器 wget 或curl等软件访问不到页面
*服务器端检查selinux iptables 及端口 进程(netstat -lnt|grep 80,ps -aux|grep nginx),查看nginx日志cat /usr/local/nginx/logs/error.log *后查看客户端:ping,telnet 192.168.1.105 80排除防火墙影响。 在测试curl/wget测试
2.Nginx常用模块说明:(后续补充)
Nginx核心模块为:ngx_http_core_module 负责nginx的全局引用,如主配置文件中的main区域events.
Nginx标准模块集合 不是nginx所必须的但是很常用,因此绝大部分nginx已经默认安装。不建议改动,生成环境中,配置,调整,优化主要是根据nginx这些模块进行修改相应的参数来实现的。常见的nginx 模块
查看nginx目录结构
tree /usr/local/nginx/
nginx主要文件目录说明:
Html目录:默认站点目录
50x.html 错误页面(会调用错误日志内容)
Index.html nginx默认首页。
logs 日志文件目录
Access.log 访问nginx默认日志存放文件。是查看访问情况可用tail -f access.log
Error.log nginx 错入日志文件
Nginx.pid nginx的pid文件 当nginx启动后会将进程pid写入此文件。
sbin目录:nginx命令目录
-- nginx nignx的启动
Nginx主配置文件说明:http://www.ha97.com/5194.html
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
#以上三行为main区,nginx核心功能模块
events {
worker_connections 1024;
}
#events区域,nginx核心功能模块;
#一下是http区开始,http区包括server多个,server区又可以包括多个location区
Nginx默认配置文件:nginx.conf.下面对nginx主默认配置文件nginx.conf.default.进行配置。
1.去掉包含#和空行的内容
egrep -v "#|^$" nginx.conf.default
vim nginx.conf.default
worker_processes 1;
#nginx进程数,建议设置为等于CPU总核心数。
events {
#事件区域块开始
worker_connections 1024;
#单个进程最大连接数(最大连接数=连接数*进程数
}
#设定http服务器
http {
include mime.types;
#nginx支持的媒体类型文件
default_type application/octet-stream;
#默认的媒体类型
sendfile on;
#开启高效文件传输模式
keepalive_timeout 65;
#长连接超时时间,单位是秒
#虚拟主机的配置
server {
listen 80;
#监听端口
server_name localhost;
提供服务的域名主机名
location / {
root html;
#站点的根目录html
index index.html index.htm;
#默认支持的首页文件
}
error_page 500 502 503 504 /50x.html;
#出现对应的http状态码使用50x.html回应客户。
location = /50x.html {
#回应客户的的页面文件
root html;
#对应的站点目录问html
}
}
}
整个站点的核心框架:
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
保存退出。
3.Nginx虚拟主机配置
虚拟主机类型(基于域名的虚拟主机【常用】,基于端口的虚拟主机【企业内部】,基于ip的虚拟主机【不常用】)
默认情况下nginx.conf与nginx.conf.default内容相同。diff进行比较。
egrep -v "#|^#" nginx.conf.default >nginx.conf
去掉包含#和空行重定向到nginx.conf中。
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
server {
listen 80;
server_name www.wy.org;
location / {
root html/www;
index index.html index.htm;
}
}
}
虚拟主机关键部分:sever{}内容
创建域名及站点目录。
mkdir -p /usr/local/nginx/html/www
echo "http://www.wyl.org" > www/index.html
语法检查:
/usr/local/nginx/sbin/nginx -t
1.创建nginx 启动脚本
vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() {
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
保存退出
2.更改权限
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on
.重新加载(企业最好用重新加载的方式启动nginx防止一旦服务无法启动造成数据丢失。)
/usr/local/nginx/sbin/nginx -s reload
查看进程:
ps -ef|grep nginx
netstat -lntp|grep 80
echo "192.168.1.105 >/etc/hosts" >www.wyl.org">>/etc/hosts
curl测试ok
3.如何配置多个虚拟站点
在nginx主配置文件中http{}区域,配置多个server区域即可。
如:http{}中加入多个server区域
server {
listen 80;
server_name bbs.wy.org;
location / {
root html/www/bbs;
index index.html index.htm;
server {
listen 80;
server_name blog.wy.org;
location / {
root html/blog;
index index.html index.htm;
保存退出即可。
创建站点目录这里我们使用shell可以手动自己创建
[root@localhost conf]# for n in bbs blog
> do
> mkdir -p /usr/local/nginx/html/$n;
> echo "http://$n.wyl.org">/usr/local/nginx/html/$n/index.html;
> echo "192.168.1.105 $n.wyl.org">>/etc/hosts;
> cat /usr/local/nginx/html/$n/index.html;
> cat /etc/hosts
> done
运行即可。
重新加载测试成功.
4.基于端口的虚拟主机配置:
修改nginx.conf 中http{}区域虚拟主机server块中的listen 项即可,域名可以不做修改。
修改www.wyl.org:对应的listen 为80;bbs.wyl.org对应的为8080;blog对应的为8081
测试如下:
基于ip的虚拟主机配置只需要将nginx.conf 中http{}区域虚拟主机listen块中的端口 项改成ip:端口即可;server_name也可改成ip即可。
5.企业实战
企业中常常将虚拟主机与主配置文件分开,有利于管理。例如:将虚拟主机从nginx.conf中剥离,在/usr/local/nginx/conf/ 下创建vhosts目录单独存放,然后在创建单个虚拟主机的配置文件,加入虚拟主机配置内容。如www.conf; bbs.conf; blog.conf等虚拟主机配置文件。然后在主配置文件(nginx.conf)加入加载虚拟主机配置文件的路径如:include vhosts/*.conf;
具体配置如下:
mkdir /usr/local/nginx/conf/vhosts
[root@localhost bbs]# sed -n '11,19p' /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.wyl.org;
location / {
root html/www;
index index.html index.htm;
}
}
查看继续:
sed -n '11,19p' /usr/local/nginx/conf/nginx.conf >/usr/local/nginx/conf/vhosts/www.conf
sed -n '20,27p' /usr/local/nginx/conf/nginx.conf >/usr/local/nginx/conf/vhosts/bbs.conf
sed -n '28,36p' /usr/local/nginx/conf/nginx.conf >/usr/local/nginx/conf/vhosts/blog.conf
查看sed -n '11,36p' /usr/local/nginx/conf/nginx.conf 无误后继续--》删除主配置文件中的虚拟主机配置。
sed -i '11,36d' /usr/local/nginx/conf/nginx.conf 删除后如图:
执行插入命令:插入虚拟主机配置文件路径:
sed -i '10 i include vhosts/*.conf;' /usr/local/nginx/conf/nginx.conf
检查文件是否创建成果:
tree /usr/local/nginx/conf/vhosts/
cat /usr/local/nginx/conf/vhosts/www.wyl.org
cat /usr/local/nginx/conf/vhosts/bbs.wyl.org
cat /usr/local/nginx/conf/vhosts/blog.wyl.org
检测:/usr/local/nginx/sbin/nginx -t
加载:/usr/local/nginx/sbin/nginx -s reload
测试curlxxxx ok
6.虚拟主机别名设置:
如给www.wyl.org添加别名wyl.org只需要在虚拟主机配置文件中 server_name www.wyl.org 后加wyl.org即可。当然在本机hosts文件中加入本地ip解析即可。测试curl wyl.org 结果ok;
4.配置nginx status 状态信息检查功能
1.nginx status模块ngx_http_suub_status_module模块
查看是否安装该模块:
/usr/local/nginx/sbin/nginx -V
查看已经安装:具体配置如下:
cat >>/usr/local/nginx/conf/vhosts/status.conf<<EOF
> #suatus
> server {
> listen 80;
> server_name status.nginx.org;
> location / {
> stub_status on;
> access_log off;
> }
> }
> EOF
由于我曾经在主配置文件中定义了vhosts下文件的加载配置。所以不用再重新配置主配置文件。Stub_status on ;表示打开状态开关。
添加本地域名解析:echo "192.168.1.105 status.nginx.org">>/etc/hosts
检查配置文件 /usr/local/nginx/sbin/nginx -t
重新加载: /usr/local/nginx/sbin/nginx -sreload
测试:curl status.nginx.org
Active connections: 1
server accepts handled requests
12 12 23
Reading: 0 Writing: 1 Waiting: 0
Active connections:1 表示正处于活动状态的连接数为1个
第一个server 12 表示nginx启动到目前为止共处理了12个连接
第二个accepts 12表示nginx启动到目前一共进行了12次握手(请求丢失数=握手数-连接数)
第三个 handled requests表示总共处理了多少次请求 23次请求。
Readming 表示nginx读取到客户端的header信息数,
Writing :1为nginx返回给客户端的header的信息数,
waiting:0 表示nginx已经处理完正在等会下一次请求指令的驻留连接,在开启keep-alived的情况下,这个值等于active -(readming+writing)
5.为nginx 增加错误日志(error_log)配置
error_log属于ngx_core_module核心模块。Error_log可以放在main区块中全局配置,也可放置在不同虚拟主机中单独记录。
error_log的语法格式
error_log file level;
关键字 日志文件 错误日志级别
企业常见级别如:warn|error|crit三个级别注意不要配置info等低级别,这回带来巨大的I/O消耗。
错误日志默认级别为:error
错入日志可以放置的标签如:main,http,server,location区。
错入日志配置:只需要在主配置文件nginx.conf中设置全局即:work_processes 1;后面加入error_log logs/error.log;即可。
6.nginx 访问日志(access_log)配置
Nginx访问日志access_log主要由log_format和access_log控制
logformat:定义记录日志格式
access_log:制定日志的路径及使用何种日志格式记录日志
Logformat默认日志格式如:
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默认配置:
access_log logs/access.log main;
Main 为日志标签,记录日志时,用过main标签选择制定格式。
日志变量说明:
Remote_addr 记录访问网站客户端,
http_x_forwarded_for 当前由代理服务器时,设置web节点记录客户端地址的配置,此参数生效前提是代理服务器上也进行了相关的x_forwarded_for设置。
$remote_user 远程客户端名称。
$time_local 记录访问的时间时区。
$request http请求起始行信息
$status http状态码
$body_bytes_sents 服务器发送给客户端的响应body字节数,
$http_referer 记录次请求是从哪个连接访问过来的。可以根据referer设置防盗链设置。
$http_user_agent 记录客户端访问信息。如浏览器手机客户端等。
默认日志:
客户端地址-远程客户端名称-访问时间-http请求起始行信息-http状态码-服务器发送给客户端的响应body字节数-从哪里链接访问过来的-客户端信息,设置web节点记录客户端地址配置。
access_log 参数说明:buffer=size 存放访问日志的缓冲区大小,flush=time 为将缓冲区的日志刷到磁盘的时间,gzip表示压缩级别,[if=condition]表示其他条件,默认无需配置。
access_log off 表示不记录访问日志。
放置位置在:http,server,location ,if in location,limit_except中。
企业实战::
将默认配置文件中的log_format配置复制在主配置文件nginx.conf中即可:
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_www.log main;不指定格式,将已默认的combined格式记录。
配置虚拟主机访问日志文件的路径:如在虚拟主机配置文件中server区添加
sed -i '8 i access_log logs/access_www.log main;' /usr/local/nginx/conf/vhosts/bbs.conf
sed -i '8 i access_log logs/access_www.log main;' /usr/local/nginx/conf/vhosts/www.conf
sed -i '8 i access_log logs/access_www.log main;' /usr/local/nginx/conf/vhosts/blog.conf
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
测试
curl www.wyl.org
cat access_www.log
cat access_www.log
192.168.1.105(客户端ip) -(没有远程用户所以为空)) - [09/Nov/2016:00:29:11 +0800](时间) "GET / HTTP/1.1" (http起始行信息)200 (http状态码)19(服务器发送给客户端的响应body字节数) "-"(直接访问所以referer为空) "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"(客户端信息) "-"(没有代理服务器所以为空。)
可以在日志参数中加上buffer和flush 选项,这样可在高并发场景下提升网站的访问性
在虚拟主机日志配置区域加入:gzip buffer=32k flush=5s配置如下:buffer=size 存放访问日志的缓冲区大小,flush=time 为将缓冲区的日志刷到磁盘的时间,gzip表示压缩级别
具体配置如下:
access_log logs/access_www.log main gzip buffer=32k flush=5s;
配置如下
sed -i s@"main;"@"main gzip buffer=32k flush=5s;"@g /usr/local/nginx/conf/vhosts/www.conf
sed -i s@"main;"@"main gzip buffer=32k flush=5s;"@g /usr/local/nginx/conf/vhosts/bbs.conf
sed -i s@"main;"@"main gzip buffer=32k flush=5s;"@g /usr/local/nginx/conf/vhosts/blog.conf
检查ok
7.Nginx 访问日志轮询切割
Nginx默认会将所有访问日志生成到一个指定的访问日志文件中access.log里 但这样一来时间长了就会导致日志个头很大。不利于日志的分析和处理。因此需要对日志进行按天或者按小时切割。分成不同的文件保存。这里设置按天切割。
apache有切割工具,nginx需要写脚本进行切割。
vim /usr/local/sbin/nginx_logrotate.sh
#!bin/bash
d=`date -d "-1 day" +%F`
[ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log
mv /tmp/access.log /tmp/nginx_log/$d.log
/etc/init.d/nginx reload >/dev/null
cd /tmp/nginx_log/
gzip -f $d.log
保存退出即可。
sh -x /usr/local/sbin/nginx_logrotate.sh
ls /tmp/nginx_log/ 列出日志压缩文件。
最后写一个计划任务:每天0点0分执行 即可。
cat >>/var/spool/cron/root <<EOF
00 00 * * * * /bin/sh /usr/local/sbin/nginx_logrotate.sh
设置ok.
8.Nginx location
location 作用:根据用户请求的url进行匹配,匹配成功后来执行相关的引用操作。
语法:
location [ = | ~ | ~*| ^~ ] uri {
......
}
location指令 [ = | ~ | ~*| ^~]匹配标识 uri 匹配的网址,{...}匹配后需要执行的配置端。
实例:
location = / {
[ configuration A ]
}
当用户请求”/”时将匹配configuration A
location / {
[ configuration B ]
}
当用户请求”/index.html”时将匹配configuration B
location /documents/ {
[ configureation C ]
}
当用户请求“documents”时将匹配configuration C
location ^~ /images/ {
[ configureation D ]
}
当用户请求“images/1.gif”时将匹配configuration D
location ~* \.(gif|jpg|jpeg)$ {
[ configureation E ]
}
当用户请求“/documents/1.jpg”时将匹配configuration E
匹配优先级:
“Location = {” 精确匹配
“location ^~/images/ {”匹配常规字符串,不做正则匹配
“location ~*\.(gif|jpg|jpeg)$ {”正则匹配
“location / {” 所有location都不能匹配后的默认匹配。
9.Nginx rewrite--[301,302 url跳转]
Nginx rewrite 主要实现URL地址重写。需要pcre软件支持。默认支持。
Nginx rewrite 指令语法:
应用位置::server location if
URL rewrite跳转
Rewrite指令的重写功能由flag标记来实现结尾的flag标记分别有last,break,redirect,permanent。
Last ,break实现url重写
Redirect,permanent 实现url跳转。
Last :匹配完规则后,继续向下匹配。
Break:匹配完规则后,立即终止。不在向下匹配。
Redirect :返回302 临时重定向。浏览器地址会显示跳转后的url
Permanent:返回301 永久重定向,浏览器地址栏会显示跳转后的url
301跳转实现访问wyl.org 跳转到bbs.wyl.org
实例:
vim /usr/local/nginx/conf/vhosts/www.conf
server {
listen 80;
server_name wyl.org ;
rewrite ^/(.*) http://bbs.wyl.org permanent;
}
server {
listen 80;
server_name www.wyl.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main gzip buffer=32k flush=5s;
}
跳转后显示:
不同域名跳转实战:
在server标签中加入:
if ( $http_host ~* “^(.*)\.wyl.org$” ){
Set $domain $1;
rewrite ^(.*) http://bbs.wyl.org/$domain/$domain/wyl.html break;
}
建议:location 标签,sever标签用last标签,普通location 或if用rewrite格则,建议使用break标记。
10.Nginx 访问认证
一般用在企业内部人员访问的地址上,例如企业网站后台,mysql客户端phpmyadmin,等
访问认证两个参数:
auth_basic 语法:auth_basic string|off;
auth_basic_user_file 语法:auth_basic_user_file file;
两者使用位置:http,server.location,limit_except中
配置如下:
location ~ .*admin\.php$ {
auth_basic "aminglinux auth";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
}
密码可以用apache 再带的htpasswd或openssl passwd 设置用户名密码
设置密码用户添加密码
/usr/local/apache2/bin2/bin/htpasswd 工具创建
如果没有yum install htpasswd -y 安装后设置。
htpasswd -c /usr/local/nginx/conf/.htpasswd wyl
New password: 设置密码回车即可。
cat /usr/local/nginx/conf/.htpasswd
wyl:COmsWkRlYZVe.
登录直接下载。
如配置:
测试访问
Nginx服务优化
1.隐藏:软件版本信息
curl -I 192.168.1.105
HTTP/1.1 200 OK
Server: nginx/1.4.4
Date: Wed, 09 Nov 2016 12:16:40 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Tue, 08 Nov 2016 08:42:01 GMT
Connection: keep-alive
ETag: "58218fd9-13"
Accept-Ranges: bytes
配置::在Nginx配置文件中加入:server_tokens off;放置在http区。
1.更改源码隐藏nginx软件名及版本号。略过。
2.更改nginx服务的默认用户
nginx -s /sbin/nologin -M
更改配置文件参数将默认的#user nobody;改成user nginx nginx;即可。
3.优化ningx的服务性能(worker进程数)
如更改nginx 配置文件中的worke_processes 1;nginx有master进程,和worker进程,
Master进程用于管理进程,服务的进程为worker进程。
设置worker_processer 后面的数即可。一般设置为和cpu核数相同即可。
查看cpu核数:/proc/cupinfo
grep processor /proc/cpuinfo|wc -l
grep -c processor /proc/cpuinfo
数字是4 则表示一颗4核cup
sed -i 's#worker_processes 1#worker_processes 4#g' nginx.conf
grep worker_processes nginx.conf
重新加载后:ps -ef|grep nginx|grep -v grep查看worker的进程数量。
4.优化绑定不同的nginx 进程到不同的cpu上
默认情况下nginx多个进程有可能泡在某一个cpu或cpu的某一核上,导致nginx进程使用硬件资源不均。优化尽可能第分配不同的nginx进程给不同的cpu处理。达到充分利用硬件多cup核数资源的目的。
在mian 区,worker_processer 4;下加入worker_cpu_affinity 0001 0010 0100 1000;保存退出即可
worker_processer 1;
worker_cpu_affinity 0001 0010 0100 1000;
压力测试:webbench -c 20000 -t 180 http://192.168.1.105
5.Nginx 事件处理模型优化
Ningx的链接处理机制在不同操作系统上采用不同的I/0模型。在linux下采用的是epoll的i/0多路复用模型,在freebsd中使用的kqueue 的1/0多路复用模型。在solaris中使用的、dev/poll方式的i/o多路复用模型,在windows中使用的是icop等等。
Nginx模型有:usr[ kqueue|rtsig|epoll|dev/poll|select|poll]本次使用epoll模型
配置如下:nginx配置文件中events设置nginx模型
events {
use epoll;
}
解释:select,poll为标准工作模式,kqueue和epoll为高效的工作模式,不同的是epoll是在linux平台上,kqueue在BSD系统中,对于linux中nginx设置为epoll为高性能,高并发设置。
events区 是设置nginx的工作模式及连接数上线
6.调整nginx单个进程允许的客户端最大连接数
控制参数:work_connections
配置文件中work_connections的值具体根据服务器性能和程序的内存使用量来指定
默认为1024,此值受linux系统进程的最大打开文件数限制,在执行系统命令:“ulimit -Hsn 65535”后才能生效。或配置相应的文件后“worker_connections”才能生效。
此设置放置在配置文件的events区。
7.配置nginx worker进程最大打开文件数
控制参数:work_rlimit_nofile 配置如下
放置在main区,设置:
work_rlimit_nofile 65535;
8.开启高效文件传输模式
设置参数:sendfile on;
同时设置tcp_nopush tcp_nodelay指令为on 可防止 网络及磁盘i/o阻塞。
设置如下:
sendfile on;
tcp_nopush on;
可设置在:http;server;location标签。
9.优化Nginx连接参数,调整连接超时时间
设置在参数”:keepalive_timeout 60;客户端连接保持回话的超时时间为60s,超过这个时间服务器自动关闭连接,此参数为参考值
解决的问题:
将无用的链接设置问尽快超时,保护服务器的系统资源不被浪费。
当连接很多时,及时断掉那些建立好长时候,但又不工做事的连接,减少占用资源。
Lnmp环境,如果用户请求一个动态服务器,则nginx就会建立连接,请求fastCGI服务器及后端的mysql,此时就需要设置一个超时时间,在用户容忍的时间内返回数据。当然后端的fastCGI及mysql也有设置超时时间。
设置参数tcp_nodelay on;
用于激活tcp_nondelay功能提高i/o性能。
默认情况下内核不会马上发送肯能会等待更多的字节组成一个数据包,这样可能会提高i/o的性能。
设置参数client_header_timeout
设置读取客户端请求数据包的超时时间,如果超过这个时间客户端还没有发送完整的header数据服务器端将返回request time out 408 错误,可指定一个超时时间,放置客户利用http原理进行攻击。
设置参数:client_body_timeout 15;
用于读取客户端请求主体的超时时间。默认为60
设置:send_timeout 25;
用于指定响应客户端的超时时间。默认为60可改为25.如果在这个时间内客户端没有收到任何数据连接将关闭。
10.上传文件大小的限制(动态引用)
client_max_body_size 8m
设置最大的允许的客户端请求主体大小,这个请求头域有“content_length”如果超出了此配置值,客户端将相应收到413错误。意思是请求的条目过大,浏览器不能正常显示等,默认为1m 具体设置根据公司业务调整。
11.FastCGI 相关参数调优(配合php引擎动态服务器)
Nginx fastCGi客户端向后请求php动态引擎服务(php-ffpm-[fastCGI服务器])的相关参数,
Fastcgi_connect_timeout 240;
Fastcgi_send-timeout240;
Fastcgi_buffer_size 64k;
Fastcgi_buffer 4 64k;
Fastcgi_busy_buffers_size 128k;
........
详见:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
12.配置ngxin gzip 压缩实现性能优化
用户请求的内容在发送到客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,公式加快数据传输速率,提升用户访问体验。
优点:提升用户体验:发送给用户的内容小了。
节约网站带宽成本:数据压缩传送,节省了网站的带宽成本。
纯文本内容最好压缩,如html,js,css,xml,shtml等格式的文件
图片视频等文件最好不要压缩。这些文件大多是压缩的,大文件压缩会消耗大量的cpu等资源。
压缩配置:
gzip on;
#开启压缩功能
gzip_min_length 1k;
#设置允许压缩的页面最小字节
gzip_buffers 4 16k;
#压缩缓冲区大小。表示申请4个单位为16k的内存作为压缩结果流缓存。
gzip_http_version 1.1;
#压缩版本默认是1.1 用于设置识别http以协议版本号,此设置默认即可。
gzip_comp_level 2;
压缩比例 压缩比例1 表示压缩最小处理速度最快,9位最大 传输速度最快,但处理慢
gzip_types text/plain application /x-javascript text/css application/xml;
指定压缩类型,text/html 类型总会被压缩,
gzip_vary on;
Vary header支持,让前端缓存服务器进过gzip压缩,例如:用squid缓从进过nginx压缩数据。
完整配置:
gizp on;
gzip_min_length 1k
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
注意不同版本对应的gzip_types配置可能不同次实例适合nginx 1.6.3版本
此时这可通过火狐浏览器查看提前安装好火狐浏览器的yslow插件。
13.重要的前端网站调试工具
Google浏览器调试工具如按F12查看压缩机缓存结果,谷歌浏览器也可安装yslow插件。
火狐浏览器安装firebug,yslow,即可进行测试,IE安装httpwatch即可调试
14.Nginx expires功能
客户端实现本地缓存
网站视频,图片,css,js等网站元素的更改机会较少,即可以设置本地缓存为180天,等,可将,如css,js html代码缓存设置为10-30天,这样用户第一次打开也后,会在本地缓存设置的时间,时间过期后,才会重新向服务器请求。重新下载。这样设置加快了用户下次访问的速度。用户的请求和数据减少,节省了大量的服务器带宽,此功能和apache的expires功能相似。
配置:
可以通过location url规则将需要缓存的扩展名列出来,然后指定缓存时间,就可以,如果针对所有内容设置缓存,也可以不用location 。Nginx默认安装了expires(过期)功能。
如:设置客户端范围后缀名为gif,jp,jpg,png,jpeg.等文件时,第一次本地缓存时间为180天。
location ~ .*\(gif|jpg|jpeg|png|bmp|swf)$
{
expires 180d;
}
如设置:
location ~.*\.(js|css)?$
{
expires 30d;
}
设置当用户访问后缀名为js css时,本地缓存为30天。
Location内容一般都放到虚拟主机server标签 中。
2.更具url中的路径(目录)进行判断,添加expires功能范例
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
当用户访问网站的url中包含上述路径如images js css等目录时,把访问内容缓存到本地1年。
3.单个文件设置expires为7天
location ~ (robots.txt) {
expires 7d;
break;
}
设置robots.txt机器人文件设置过期时间为7天。此七天并不记录404错误日志。
可通过curl-I 查看
如:curl -I http://www.wyl.com/23.jpg
.......
expires: Mon, 19 sep 2022 02:07:18 缓存的过期时间
cache-control:max-age=315360000 缓存的总共时间,单位为秒。
.........
15.Nginx不记录不想要的访问日志
时间工作中,对于负载均衡器健康检查或默写特定文件如图片js css等日志,一般不需要记录下来,因为在系统统计pv时是按照页面计算的。而且日志写入太平凡会消耗大量磁盘的i/o,降低服务的性能。
具体配置如下:
这里用location标签匹配不记录日志的额元素扩展名,然后关掉日志。
如:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
16.Nginx 访问日志权限设置
如日志目录为/app/logs 设置权限为:
chwon -R root.root/app/logs
chmod -R 700 /app/logs 不需要给日志目录给nginx用户读等权限。
17.Nginx 访问控制
如bbs blog sns等 不允许用户发布内容到服务器,但允许用户发图片甚至附件打服务器,即开启用户上传功能,因此给服务器带来了很大的安全风险,为此利用nginx配置禁止用户上传php,shell,perl python等程序文件这样用户即使上传后也无法执行,从而加强网站的安全。
如:
1禁止解析指定目录下的指定程序。
location ~ ^/images/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*.(php|php5)$
{
deny all;
}
Nginx的范围控制的location必须写在nginx处理php服务配置前面如:
location ~.*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1
fastcgi——indexindex.php;
Include fcgi.conf
}
2.禁止访问:*.txt和.doc文件
location ~* \.(txt|doc)$ {
if ( -f $request_filename ) {
root /data/www/www;
break;
}
}
location ~* \.(txt|doc)${
root /data/www/www;
deny all;
}
3.禁止范围指定目录下的所有文件和目录
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
4.禁止访问多个目录的命令如:
Location ~ ^/(static|js){
deny all;
}
5禁止访问目录并返回指定的http状态码
如:server {
listen 80;
server_name www.wyl.org;
root /data/www/www;
lndex index.html index.htm;
access_log /app/logs/www_access.log commonlog;
location /admin/ { return 404 ;}
location /templates/ { return 403; }
}
18.限制网站来源IP访问
1.禁止某个目录让外界访问,但允许某个ip访问该目录切支持php解析如:
location ~ ^/oldboy/ {
allow 202.111.12.211;
deny all;
}
location ~ .*\.(php|php5)?$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}
限制指定ip或ip端范围
location / {
deny 192.168.1.1
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
Nginx反向代理的时候可以做限制某个客户端ip吗?
可以:方法:1
if( $remote_addr = 10.0.0.7 ){
reurn 403;}
if ($remote_addr = 218.247.17.130) {
set $allow_access_root ‘true’;
}
2.利用deny allow来限制
locaton / {
root html/blog;
Index index.php index.html index.htm;
allow 10.0.0.7;
deny all;
}
3.只拒绝某些ip访问
location / {
root /html/blog;
index index.php index.html index.htm;
deny 10.0.0.7;
allow all;
}
配置nginx禁止非法域名解析范围企业网站
server {
listen 80 default_sever;
server_name -;
return 501;
}
方法二:设置url跳转301跳转
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http://blog.wyl.org/$1 permanent;
}
方法三:
if ($host !~ ^www/.wyl/.com$){
Rewrite ^(.*) http://www.wyl.com$1 permanent;
}
19.Nginx 图片及目录防盗链
非法调用其他网站资源,如图片,等来填充自身网站效果,这一举动浪费原网站的网络流量,增加了源网站的服务压力等。
根据http referer实现防盗链。Referer是header的一部分,当浏览器向web服务器请求时都会带上referer。告诉服务器从哪里来的。但是部分特殊文件如flash等不向服务器提交referer。 Header.所以referer只能做到部分防盗链。
通过referer可以检测到访问的来源网址,从而进行阻止。
根据cookie防盗链
对于flash,windws media视频,媒体流的rtsp协议等他们不向服务器提交headerreferer,例如activeX 插件不传递referer,但会传递cookie.
所以需用cookie防盗链
设置:可以再显示ActiveX页面的<head></head>标签中嵌入一段javaScript代码设置
“Cookie:Cache=av”如下:
<script> document.cookie=“Cacheavpath/”;</script>
设置方法:通过加密变换方式实现:通过php代码示例实现。
二:利用referer实现
配置:
location ~*\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar|)$ {
valid_referers none blocked *.etiantian.org wyl.org;
if ( $invalid_referer {
rewrite ^/ http://www.wyl.org/img/nolink.jpg;
})
access_log off;
expires 3d;
}
if{}指如果不是上面指定的地址就指定rewrite重定向地址,也可以通过return返回403错误页面。rewrite ...jpg表示错误页面。Access_log 表示不记录范围日志,减轻压力。
表示所有文件设置为3d的浏览器缓存。
20.错误页面优雅展示
200 表示服务器返回网页成功,
301表示永久跳转,302表示临时跳转,
403禁止范围,请求合法,由于服务器请求匹配了预先规则,所以决绝响应客户端请求,此问题一般是权限配置不当所致。
404,服务器找不到客户端请求的指定页面,可能是客户单请求了服务器不存在的页面所致。
500 内部服务器错误,这个错误一般为服务器的设置或内部程序问题所致。
502 代理服务器请求后端服务器没有响应网关服务器。一般是代理服务器下面的节点出了问题所致。
503,服务器当前不可用,肯能服务器超载,或宕机措置,或代理服务器后没有可以提供的服务节点。
504.网关超时,一般是网关代理服务器请求后端服务器,后端服务器 没有在特定的时间内完成处理请求,一般是服务器过载所致,没有在指定的时间内返回数据给代理服务器。
范例:对错误代码403 404等错误信息页面重定向到网站首页或其他指定的页面,提示网站的用户范围体验。
1.对错误代码403实行本地页面跳转。命令如下
server {
listen 80;
Server_name www.wyl.org;
location / {
root html/www;
index index.html index.htm;
Error_page 403 /403.html; #<==当本地根目录html/www出现403错误时,会跳转到403.html页面
}
}
同样设置404等其他页面设置方法同上
2.50x页面放到本地单独目录下进行优雅展示
error-page 500 502 503 504 /50.html;
location = /50x.html {
Root/data0/www/html;
}
3.更改状态码为新的状态码并显示指定的文件内容如:
server {
listen 80;
server_name www.wyl.org;
location / {
root html/www;
index index.html index.htm;
error_page 404 /wyl.jpg;
}
}
4.错误状态码页面url重定向
server {
listen 80;
server_name www.wyl.org;
location / {
root html/www;
index index.html index.htm;
error_page 404 http://www.wyl.org;
}
}
5.错误页面重定向到一个location
location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://backend;
}
如企业错误页面定义:
error_page 500 501 502 503 504 http://eer.wyl.org/error1.html;
error_page 400 403 404 405 408 410 412 413 414 415 http://err.wyl.org/error2.html
21.Nginx站点目录文件及目录权限优化
设置所有站点目录的用户组都应该是root,所有的目录权限都为755 所有文件的权限都为644.
chmod -R 755 xxx;chown root.root xxx
22.Nginx防爬虫优化
一些垃圾搜索引擎访问抓取网站造成网站流量偏大,或者设定一些值得目录内容允许那些搜索引擎可以抓取那些不能抓取。
实现:通过$http_user_agent获取客户端agent,设置放置N多爬虫代理范围网站。
if ( $http_user_agent ~*
“qihoobot|baiduspider|Googlebot|sogou web spider|sogou spider|YoudaoBot|Sosospider”
) {
return 403;
}
如设置不同浏览器范围进行跳转:
if ( $http_user_agent ~*
“Firefox|MSIE”
) {
rewrite ^(.*) http://bbs.wyl.org/$1 permanent;
}
如果浏览器火狐ie就会跳转到http://bbs.wyl.org
23.利用Nginx 限制http的请求方法
在前面如当上传服务器上传数据到存储时,用户上传写入目录就不得不给nginx对应的用户相关权限,这样一旦程序漏洞,木马就有可能上传到服务器挂载的储存服务器目录里,虽然我们禁止了php,sh,pl,py等扩展名的解析,但还会遗漏一些意想不到的程序文件被执行。所以我们利用GET,HEAD,POST方法限制
放置用户通过上传服务器访问存储内容,让访问渠道只能从静态服务器进入。如:
if ( $request——method ~* ^(GET$)) {
return 501;
}
24.使用CDN做网站加速
CDN -content,Delivey Network 内容发布系统。是一种分布式缓存集群,通过智能Dns判断用户的来源,例如:让北京的访问北京电信访问北京电信的cache服务器上的内容,让天津的访问天津网通的cache服务器内。
是否使用了CDN加速技术可用crul -I 查看如curl -I www.163.com 有CDN cache server v2.0)信息表明163使用了CDN做了网站加速。
国内较大的CDN加速提供商有网宿,蓝讯,快网。例如独立的静态服务器最适合用CDN加速。
25.程序架构优化:如前端可加入负载均衡器haproxy/nginx等,根据url过滤请求,然后抛给后面的服务器。
26.使用普通用户启动Nginx (监牢模式)
给nginx服务器降权
管理nginx权限:root
普通用户跑业务:puto
添加用户--》更改主配置文件内容-设置root端口80为8080
给用户设置站点权限等。
27.控制nginx并发连接数
ngx_http_limit_conn_module 这个模块用于限制每个定义的key值得连接数,特别是hi单个ip的连接数。
语法:limit_conn_zone key zone=name:size; key可以是字符串,nginx自带变量,$binary_remote_addr,$server_name. size为内存区域的大小。用于设置共享内存区域。
使用:上下文http标签中。
mimit_conn参数,指定key值得最大连接数。当超过最大连接数时,服务器返回503错误
上下文:http,server,location。
http{
.................
limit_conn_zone $binary_remote_addr zone=addr:10m
server {
listen 80;
limit_conn addr 1; #限制单ip的并发连接为1 }
......}
测试:ab -c1 -n 10 http://192.168.1.105 -c 为并发数,-n为请求总数。
ab -c2 -n 10 http://192.168.1.105 -c 为并发数,-n为请求总数。
测试配合日志查看结果。
设置虚拟主机的总链接数甚至连着可以同时限制
http{
.................
limit_conn_zone $binary_remote_addr zone=addr:10m
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
limit_conn perserver 2; #设置虚拟主机连接数为2.}
......}
28.控制客户端请求nginx的速率
ngx_http_limit_req_module 模块用于设置限制 每个ip范围每个定义的key的请求速录。
语法:limit_req_zone key zone=name:size rate=rate;
使用:上下文 http
用于设置共享内存区域,key可以是字符串,nginx自带变量,$binary_remote_addr,$server_name. size为内存区域的大小。用于设置共享内存区域。
limit_req参数
语法:limit_req zon=name [burst=number][nodelay];
使用:上下文 http server location
这里使用了令牌原理burst=num,一共有num个令牌,当令牌发完后,多出来的返回503错误。
Nodelay 默认不超过burst值得前提下,会排队处理
http{
.................
limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;
#客户端的请求作为key值,内存区域命名为one,分配10m的内存空间,范围速率限制为1秒1次请求。
server {
listen 80;
limit_req zone=one busrst=5; #使用自定义的名one 的内存空间,队列值是5,即可以有5个排队请求,超过五个的排队,返回503}
......}
测试:ab -c 4 -n 1000 http://192.168.1.105
ab -c 5 -n 1000 http://192.168.1.105
ab -c -n 1000 http://192.168.1.105 测试配合日志查看结果。