Nginx实战

主流服务器比较

Tomcat:开源、运行servlet和jsp web应用软件基于java的web应用软件容器。对静态文件、高并发处理比较弱。

Lighttpd:是Nginx的主要竞争对手之一。

Nginx特点

可以高并发连接;生产环境可支持2~4万并发连接,得益于Nginx使用了最新的epoll(Linux2.6内核)和kqueue(FreeBSD)网络IO模型。且耗资源很低。

内存消耗少;

成本低廉;开源软件,可免费使用用于商业

配置文件简单

支持rewrite重写规则;能够根据域名、url不同将http请求分到不同的后端服务器群组

内置健康检查功能;Nginx proxy后端的某台web服务器宕机,不会影响前端访问

节省带宽;支持gzip压缩

稳定性高;用于反向代理,宕机概率低

支持热部署;部署容易,可7x24小时不间断运行,可在不间断软件运行的情况下升级

安装部署

磁盘空间10M以上

GCC编译器工具及相关工具;GCC-GNU Compiler Collection是GNU社区推出的强大、性能优越的用于编程开发的自由编译器,目前可编译的语言包括C C++ Object-C Fortran、Java

安装Autoconf和Automake工具,用于自动创建功能完善的Makefile

yum -y install gcc gcc-c++ autoconf automake

安装模块依赖的工具;yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

Windows下安装;解压文件进入Nginx目录下,DOS命令:start nginx;nginx -s stop/quit/reopen/reload

Linux环境下(centos)安装:解压文件,cd到nginx目录下,./configure;  make;  sudo make install; 默认安装到/usr/local/nignx目录下;可通过./configure --help查看nginx可选择的编译选项

--prefix= Nginx安装路径

--sbin-path 默认prefix/sbin/nginx

--conf-path 默认prefix/conf/nignx.conf

--pid-path 默认prefix/logs/nignx.pid

--lock-path nginx.lock文件的路径

--error-log-path 默认prefix/logs/error.log

--http-log-path 默认prefix/logs/access.log

--builddir=xxx 指定编译的目录

--with-http_ssl_module 开启HTTP SSL模块,使Nginx可以支持https请求

--without-http_gzip_module 禁用ngx_http_gzip_module

--without-http_auth_basic_module

Nginx启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf; 参数-c指定配置文件的路径

nginx停止:ps查看nginx进程,master process为主进程,worker process为子进程;命令kill -9 `/usr/local/webserver/nginx/logs/nginx.pid` 为nginx进程文件的默认路径,强制停止;-QUIT从容停止;-TERM、-INT快速停止

修改配置文件后检查是否有错误:/usr/local/webserver/nginx/sbin/nginx -t -c /usr/local/xxx/nginx.conf;检查没有报错后可以平滑重启【重新加载配置文件】:kill -HUP `/usr/local/.../nginx.pid`

配置优化

默认配置文件在nginx安装目录的conf二级目录下,主配置文件为nginx.conf

配置文件的结构:events{...} http{...server{...} server{...}...}

错误日志级别error_log /data/local/.../nginx_error.log crit; 级别有[debug | info | notice | warn | error | crit]

允许的连接数:events下 worker_connections 51200;

设置客户端能够上传的文件大小:http下 client_max_body_size 8m;

配置基于IP的虚拟主机

在eth0网卡设备添加IP别名:ifconfig和route命令

/sbin/ifconfig eth0:1 192.168.1.23 broadcast 192.168.1.255 netmask 255.255.255.0 up

/sbin/route add -host 192.168.1.23 dev eth0:1

/sbin/ifconfig eth0:2 192.168.1.24 broadcast 192.168.1.255 netmask 255.255.255.0 up

/sbin/route add -host 192.168.1.24 dev eth0:1

这种命令行配置在机器重启后失效,可编辑文件在机器重启后自动执行命令vi /etc/rc.local 在文件末尾增加以上命令保存

编辑配置文件,添加多个server对应多个ip;listen 80 表示监听服务器上所有ip的80端口,可通过server_name区分不同的虚拟机。

配置基于域名的虚拟机

可以使很多虚拟主机共享一个IP地址,有效解决了IP地址不足的问题。

```http

{

server

{

listen 80;

server_name a.test.com;

access_log logs/a.test.com.access.log combined;

location /

{

index index.html index.htm;

root /data/html/a.test.com;

}

}

server

{

listen 80;

server_name b.test.com;

access_log logs/b.test.com.access.log combined;

location /

{

......}

}

}```

日志文件配置与切割

日志格式设置

日志格式的设置可以在http{....}之间,或者server{....}之间

log_format name format

Nginx服务器,在作为反向代理后不能获取到客户端的真实IP地址,$remote_addr获取到的是反向代理服务器的IP 地址,但是反向代理服务器在转发请求的HTTP头信息时,可增加X-Forwarded-For信息用于记录客户端IP地址;可以通过设置日志格式记录IP信息。

log_format mylogformat  '$http_x_forwarded_for - $remote_user [$time_local]'

日志路径设置

access_log path [format ]

关闭日志:access_log off;

使用默认的combined格式日志记录:access_log /data/.../filename.log combined;

使用自定义的格式日志记录:

log_format  mylogformat  xxx

access_log  /data/.../access.log  mylogformat  buffer=32k;

可以使用变量名:access_log  /data/.../$server_name.log;  server_name为所配置的主机名

要注意权限问题:配置文件中用户名 和 日志文件目录的用户名一致,否则无法创建

缓冲不会被使用

使用open_log_file_cache 设置经常被使用的日志文件描述符缓存

日志文件的切割

生产环境中服务器访问日志非常多,日志文件很大,需定时切割,一般按天切割。

可以通过命令定时切割:

mv /data/logs/access.log /data/logs/20171105.log

kill -USR1 Nginx主进程号

Nginx主进程号可以通过命令获取:kill -USR1 `cat /usr/local/.../nginx.pid`;  pid为配置文件中的设置。

设定每天零点定时执行脚本

设置缓存

expires 作用域:http、server、location

设置浏览器本地缓存:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 30d;

}

location ~ .*\.(js|css)?$

{

expires 1h;

}

CGI和fastcgi

CGI是为了web server传递过来的数据是标准格式的,它是一种协议在web server与web 应用之间。如果http请求的是静态文件index.html,web server(Nginx)可以直接在文件目录中查找然后直接返回给浏览器;如果是动态文件index.php 则需要通过cgi程序如php解析器处理参数格式传给php应用服务器,初始化环境、解析php.ini、处理请求再以cgi规定的格式返回i处理结果、退出进程,web server再把结果返回给浏览器。

由于CGI每次处理请求都会fork进程重复所有的步骤,因此性能、效率低;FASTCGI则会fork一个master进程进行解析php.ini、初始化环境等,再fork 多个worker进程,当有请求时master会传递给worker进行处理,master进程继续接受下一个请求,它只用于分配请求,而由worker去处理。

Nginx与PHP

FastCGI的工作原理:

CGI解释器的反复加载是CGI性能低下的主要原因;改进--CGI解释器保持在内存中并接受FASTCGI进程管理器调度。

FASTCGI进程管理器自身初始化,启动多个CGI解释器进程等待来自web server的连接

Nginx接收到请求后采用TCP或UNIX套接字方式转发到FASTCGI主进程,主进程选择并连接一个CGI解释器(子进程);Nginx将CGI环境变量和标准输入发送到FASTCGI子进程php-cgi

php-cgi处理完成后将标准输出和错误信息从同一连接返回Nginx,当FASTCGI子进程php-cgi关闭连接时,请求便告知处理完成。子进程接着等待并处理来自FASTCGI进程管理器的下一个连接。而在一般的普通CGI模式中,php-cgi就退出了,下一次连接时需要重新初始化环境、解析php.ini

搭建LNMP环境

安装Tomcat

安装jdk

可下载bin文件,http://java.sun.com/javase/downloads/widget/jdk6.jsp

将下载的bin文件,赋予可执行权限,执行文件 ./jdk-6u17-linux-x64.bin

修改环境变量:vi /etc/profile

末尾添加:

JAVA_HOME="/usr/local/jdk"

CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"

PATH=".:$PATH:$JAVA_HOME/bin"

CATALINA_HOME="/usr/local/tomcat"

export JAVA_HOME CATALINA_HOME

保存退出后,source /etc/profile 使环境变量生效

安装Tomcat

下载tar.gz包

解压缩 tar zxvf xxx

mv xxx-tomcat /usr/local/tomcat

cp -rf /usr/local/tomcat/webapps/*  /data0/htdocs/www/ 复制文件到你的网站目录下

vi /usr/local/tomcat/conf/server.xml

查找appBase="webapps" 修改为:appBase="/data0/htdocs/www"

启动Tomcat:/usr/local/tomcat/bin/startup.sh

停止Tomcat:/usr/local/tomcat/bin/shutdown.sh

nginx的配置文件:

在配置文件中,静态文件HTML网页、JS、CSS、Flash等使用Nginx处理;.jsp / .do 的请求,由Nginx反向代理Tomcat HTTP服务器处理。

http{

........

upstream tomcat_server{

server 127.0.0.1:8080;

}

server{

listen 80;

server_name xxx;

index index.html index.htm index.jsp default.jsp default.do;

root /data0/htdocs/www;

if (-d $request_filename)

{

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

location ~ \. (jsp|jspx|do)?$ {

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://tomcat_server;

}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires  30d;

}

location ~ .*\.(js|css)?$

{

expires  1h;

}

access_log  off;

}

}

Nginx和Tomcat都是服务器程序,地位平等,只是相互协作工作,配置Nginx将网站的静态文件,图片等请求由Nginx来处理(擅长处理静态文件);将jsp、java程序以反向代理的形式交给Tomcat处理。

负载均衡

手动选择:

如软件下载网站,选择使用华北电信、华南联通……

DNS轮询:

同一主机名(域名)添加多条记录(IP),DNS服务器将解析请求按照记录的顺序,随机分配到不同的IP;可使用dig baidu.com 查看dns解析:

存在的问题:

可靠性低:当某台服务器发生故障,将不会有所回应;从dns去掉ip页存在缓存的问题

负载分配不均衡:不能区分服务器的差异,还有缓存问题,导致用户在一段时间内访问的是同一服务器。

使用范围:可靠性要求不高的服务器集群,如图片服务器、纯静态网页服务器集群

4、7层负载均衡设备

现代负载均衡通常操作与OSI网络模型的4、7层【传输层、应用层】

常见的四/七层负载均衡设备:

硬件负载均衡交换机:价格贵,几十万人民币,如百度、新浪、搜狐……

软件四层负载均衡:LVS (Linux virtual server)

软件七层负载均衡:基于HTTP反向代理,Nginx、haproxy等

多线多地区智能dns解析 & 混合负载均衡

根据用户本地设置的dns服务器线路和地区,将对同一域名请求解析到不同ip上。

Nginx负载均衡、反向代理配置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容