王志广的个人分享

Nginx学习

admin发表于2015-08-24  3,741次浏览 标签: 

1、Nginx描述
Nginx是一款轻量级的Web服务器/反向代理服务器,其特点是稳定,占有内存少,并发能力强。

2、Nginx安装
nginx依赖于pcre库,要先安装pcre
yum install pcre pcre-devel
wget http://nginx.org/download/包
tar zxvf nginx-1.4.2.tar.gz 包
/configure –prefix=/usr/local/nginx
make && make install
编译命令
–prefix= – Nginx安装路径
–sbin-path= – Nginx可执行文件安装路径
–conf-path= – 在没有给定-c选项下默认的nginx.conf的路径
–pid-path= – 在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径
–lock-path= – nginx.lock文件的路径
–error-log-path= 默认的错误日志的路径
–http-log-path= – 在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径
–user= – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户
–group= – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组
–builddir=DIR – 指定编译的目录
–with- 启用模块
–without- 禁用模块
–add-module=PATH 添加第三方插件

后面会用到
nginx状态模块和nginx的memcache插件
/configure –prefix=/usr/local/nginx/ –add-module=/app/ngx_http_consistent_hash-master –with-http_stub_status_module
nginx状态模块配置
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.5;
deny all;
}

3、Nginx命令
/sbin/nginx 开启
cat /xxx/path/log/nginx.pid 获得nginx的主进程号
Kill -信号选项 nginx的主进程号 nginx的信号控制
信号量
TERM,INT、QUIT(关闭等请求完)、HUP(平滑重启)、USR1(重读日志)、USR2、WINCH
例如:重读日志Kill -USR1 `cat /xxx/path/log/nginx.pid`
/sbin/nginx [-s {stop,quit,reload},-v,-t,-q,-g]

4、Nginx的log处理
#!/bin/bash
log_base=”/usr/local/nginx/logs”
log_path=${log_base}/$(date -d yesterday +”%Y”)/$(date -d yesterday +”%m”)
mkdir -p $log_path
mv $log_base/access.log $log_path/access_$(date -d yesterday +”%Y%m%d”).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
#echo access_$(date -d yesterday +”%Y%m%d”).log
日志格式在conf中
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
referer:http-user-agent用户代理/蜘蛛 ,被转发的请求的原始IP
http_x_forwarded_for:原始IP
通过日志可以防盗链
location ~ .*\.jpg$ {
valid_referers none blocked *.wangzhiguang.com.cn;
if($invalid_referer){
#rewrite ^/ 网站;
return 403;
}}

5、Nginx的nginx.conf
worker_processes 1;工作的子进程,一般设置为CPU数*核数
Event {
worker_connections 1024;//指一个子进程最大允许连1024个连接
}
http {//这是配置http服务器的主要段
server {
listen 80; #监听端口
server_name a.com; #监听域名
location / {
root /var/www/a.com; #根目录定位
index index.html;
}}}
location可分为
location = patt {} [精准匹配]
location patt{} [一般匹配]
location ~ patt{} [正则匹配]
例如 location ~ image {}

rewrite 重写
if (条件) {} 设定条件,再进行重写
set #设置变量
return #返回状态码
break #跳出rewrite
rewrite #重写
条件:“=”来判断相等,用于字符串比较“~”用正则来匹配(此处的正则区分大小写)~*不区分大小写的正则-f-d-e来判断是否为文件,为目录,是否存在.
例如:if($http_user_agent ~ MSIE){ rewrite ^.*$ /ie.htm; break; } IE重写
if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /404.html break; }
rewrite abc-([\d]+)\.html$ /abc.php?id=$1;

加载PHP处理
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

gzip压缩
gzip配置的常用参数
gzip on|off; #是否开启gzip
gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_disable #正则匹配UA 什么样的Uri不进行gzip
gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_proxied # 设置请求者代理服务器,该如何缓存内容
gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
gzip_vary on|off # 是否传输gzip压缩标志

nginx的缓存设置
nginx中设置过期时间,非常简单,
在location或if段里,来写.
格式 expires 30s;expires 30m;expires 2h;expires 30d;
(注意:服务器的日期要准确,如果服务器的日期落后于实际日期,可能导致缓存失效)
另: 304 也是一种很好的缓存手段

反向代理
以反向代理为例, nginx不自己处理php的相关请求,而是把php的相关请求转发给apache来处理.
location ~ \.(jpg|jpeg|png|gif)$ {
proxy_pass http://192.168.1.1:8080;
}

负载均衡
upstream image_pool {
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
}

nginx与memcached的组合
PHP中开启一致性哈希php.ini中memcache.hash_strategy=consistent;
使用的时候直接添加memcache服务器,它自动判断连接那台服务器。
需要安装ngx_http_php_memcache_standard_balancer-master第三方插件
/configure –prefix=/xxx/xxx –add_module=/path/ngx_module
在外部配置
upstream memserver { 把用到的memcached节点,声明在一个组里
hash_key $request_uri; // hash计算时的依据,以uri做依据来hash
server 127.0.0.1:11211;
server 127.0.0.1:11212;
}
location / {
set $memcached_key “$uri”;
memcached_pass memserver; // memserver为上面的memcache节点的名称
error_page 404 /writemem.php; //失败重新加载
index index.php index.html index.htm;
}

6、Nginx服务器优化
优化思路:
1: 内核层面,加大连接数,并加快tcp回收
2: mysql层面,增大连接数
3: php层面,用长连接,节省连接数
4: 用memcached缓存,减轻mysql负担

socket打开太多 ulimit -n 30000 (重启失效)
waiting太多 keepalive_timeout = 0;

系统内核层面:
net.core.somaxconn = 4096 允许等待中的监听
net.ipv4.tcp_tw_recycle = 1 tcp连接快速回收
net.ipv4.tcp_tw_reuse = 1 tcp连接重用
net.ipv4.tcp_syncookies = 0 不抵御洪水攻击
ulimit -n 30000
脚本
chkconfig iptables off
ulimit -n 10240
echo 1024 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_syncookies

防火墙(建议关掉)
net.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 120

文件
fs.file-max = 655360 系统最大文件描述符
进程最大文件描述符 /etc/security/limits.conf
soft nofile 50000
hard nofile 50000

Nginx层面:
解决: nginx.conf
下面: work_connection 加大
worker_connections 10240;
Worker_rlimit_nofiles 10000;
Keepalive_timeout 0;

PHP层面
Pm = static 让fpm进程始终保持,不要动态生成
Pm.max_children= 32 始终保持的子进程数量

MYSQL层面
可以保持长连接与PHP通信

AB压力测试
ab -c 并发数 -n 次数 地址

你可以发表评论引用到你的网站或博客,或通过RSS 2.0订阅这个日志的所有评论。
上一篇:
下一篇:
没有评论
我来说两句

  Ctrl+Enter