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负载均衡、反向代理配置

你可能感兴趣的:(Nginx实战)