主流服务器比较
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负载均衡、反向代理配置