Nginx 安装及配置
中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Ngnix是一个负载均衡服务器,其特点是占有内存少,并发能力强
nginx一般用来做静态服务器,本身不具备动态解析功能,需要结合其它插件或软件使用,如tomcat,php等,在性能方面:如果,不做集群调优等情况下,
tomcat(tomcat是动态服务器,需要依赖于jdk)一般支持并发100个左右,而nginx在静态方面可以达到几万并发。
nginx(下载:http://nginx.org/en/download.html)nginx-1.9.3.tar.gz
模块依赖性
- gzip模块需要 zlib 库( 下载: http://www.zlib.net/)zlib-1.2.8.tar.gz :
gzip可以加快我们网站打开的速度,原理是通过服务器压缩,客户端浏览器快速解压,大大的节省了网站的流量,提高了网页打开的速度,
但与此同时也会增加cpu的开销。 - rewrite模块需要 pcre 库 ( 下载: http://www.pcre.org/) pcre-8.38.tar.gz :
rewrite主要时实现url的重写,通过pcre的perl兼容正则表达式进行匹配,通过rewrite规则,可实现规范的URL,或者动态的URL地址需要伪装成静态的HTML,便于搜索引擎抓到,旧URL可以通过rewrite跳转到新URL上。
- ssl 功能需要openssl库( 下载: http://www.openssl.org/ )openssl-1.1.0.tar.gz:
openssl可以生成数字证书,自带功能加密功能,增加nginx的ssl安全性。
安装:
- sudo su切换到root用户
- 1、下载完包后,我们把它们移动到一个nginx的文件夹里(mv openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz /opt/nginx),再解压(tar -zxvf openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz)
- 2、安装pcre(cd pcre-8.38 ./configure make&make install)
- 3、安装zlib(cd zlib-1.2.8 ./configure make&make install)
- 4、安装openssl(cd openssl-1.1.0 ./config make&make install)
- 5、安装nginx(cd nginx-1.9.3 ./configure make&make install) 执行./configure如果提示找不到上面安装的相关模块时,则可以使用一下命令
用--with-openssl=<openssl_dir>、--with-pcre=<pcre_dir>、--with-zlib=<zlib_dir>指定依赖的模块目录。如./configure --width-openssl=/opt/nginx
/nginx-1.9.3 在make&make install, 如果编译通过,则默认安装即可。
使用:(注意,nignx安装后的使用目录是/usr/local/nginx/)下面的说明用开始安装的目录也行。
关闭方式有以下几种
1、直接输入 ./nginx -s stop
2、 查询nginx主进程号
ps -ef | grep nginx
从容停止 kill -QUIT 主进程号
快速停止 kill -TERM 主进程号
强制停止 kill -9 nginx
若nginx.conf配置了pid文件路径,如果没有,则在logs目录下
kill -信号类型 '/usr/local/nginx/logs/nginx.pid
判断配置文件是否正确可用./nginx -t
配置文件介绍:
除了nginx.conf,其余配置文件,一般只需要使用默认提供即可 。
nginx.conf
- worker_process表示工作进程的数量,一般设置为cpu的核数(上图没截取到)
- worker_connections表示每个工作进程的最大连接数(上图没截取到)
- listener 监听端口,默认为80
- server_name监听的域名
- location{}是用来匹配URI进行配置,URI即语法中的'/uri/'。location{}配置任何查询,因为
素有请求都以/开头。
root 指定对应uri的资源查找路径,这里html为相对路径,完整路径为/opt/nginx/nginx-1.9.3/html
index指定首页index文件的名称,可用配置多个,以空格分开,如有多个,按配置顺序查找。 - error_page服务器发生错误请求时候,它会自动根据错误状态码跳转到相应的50页面。
mime.types 定义的文件扩展名与文件类型映射关系
fastcgi_params ginx配置Fastcgi解析时会调用fastcgi_params配置文件来传递服务器变量,这样CGI中可以获取到这些变量的值。默认传递以下变量:
uwsgi_params 与fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param。
scgi_params 与fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param。
koi-utf、koi-win、win-utf
这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。
koi-win: charset_map koi8-r < -- > windows-1251
koi-utf: charset_map koi8-r < -- > utf-8
win-utf: charset_map windows-1251 < -- > utf-8
Redis 的安装
- wget http://download.redis.io/releases/redis-2.8.9.tar.gz 下载软件安装包
-
tar -zxvf redis-2.8.9.tar.gz -c /opt/nginx 解压到指定的目录
-
cd /redis-2.8.9 切换到该目录下
-
sudo make & make install安装redis
-
软件安装完毕,接下来我们可以测试是否安装成功
Tomcat + Redis + Nginx集群配置
1、wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz
2、tar -zxvf apache-tomcat-7.0.70.tar.gz , mv apache-tomcat-7.0.70 tomcat1
3 、tar -zxvf apache-tomcat-7.0.70.tar.gz ,mv apache-tomcat-7.0.70 tomcat2
4、tar -zxvf apache-tomcat-7.0.70.tar.gz, mv apache-tomcat-7.0.70 tomcat3
6、之后我们创建一个文件夹test(mkdir test) 再创建一个index(vim index.jsp)内容如下
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
sessionID:<%=session.getId()%>
<br>
SessionIP:<%=request.getServerName()%>
<br>
SessionPort:<%=request.getServerPort()%>
<%
//为了区分,第二个可以是222
out.println("This is Tomcat Server 1111");
%>
7、之后分别修改tomcat1 tomcat2 tomcat3的server.xml,在<Host >内为其指定web项目的路径
<Context path="" reloadable="true" docBase="/opt/nginx/test"/>
8、cd /usr/local/nginx/conf切换到nignx安装后的目录下,修改nginx.conf(vim nginx.conf)配置文件
#user nobody;
# 进程数,一般这个和cpu核心数相等
worker_processes 2;
# 错误日志配置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid 进程
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
# work 进程连接数
use epoll;
worker_connections 2048;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
#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.log main;
# 开启高效文件传输模式,调用sendfile 进行文件的传输,但一般为了和网速的io进行平衡,
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
# 是否开启gzip压缩输出
#开启zip网页压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css application/xml;
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#负载均衡配置,nginx 是做反向代理的,访问nginx就是在访问负载均衡配置的这个server,这个可以通过log查看
# 查看的error log 从中可以清晰看到 负载均衡的地址:client: 127.0.0.1, server: localhost,request: "GET /index.jsp # HTTP/1.1", upstream: "http://127.0.0.1:18081/index.jsp", host: "localhost"
upstream localhost{
#ip_hash iphash 实现负载均衡,这里使用了轮回的方式实现
# nginx 转发的后台tomcat服务器配置,以及其权重的配置,权重越大要承载的量越大
#ip_hash; #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
server localhost:8081 weight=1 max_fails=2 fail_timeout=30s;
server localhost:8082 weight=1 max_fails=2 fail_timeout=30s;
}
# 虚拟主机的配置
server {
# 就是nginx服务的端口
listen 80;
#这个就是访问域名
server_name localhost;
# 字符编码的设置
charset utf-8;
#access_log logs/host.access.log main;
# 动静分离,动态的反向到负载均衡的tomcat上
location / {
# nginx 的根目录,当发送静态请求时会默认到这个目录下去查找
root /opt/nginx/test;
#定义首页索引文件的名称
index index.html index.htm index.jsp index.do;
}
#error_page 404 /404.html;
# 定义错误提示页面 /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#root html;
}
# 静态页面由 nginx处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
#expires 30d;
}
#jsp,do等页面交由tomcat处理
location ~ \.(jsp|do)$ {
# 代理路径,和负载均衡的 upstream localhost 这个localhost路径是一致的,但http是不能忘!
proxy_pass http://localhost;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
9、cd ../sbin/ 切换到启动命令文件夹下,执行sudo ./nginx -t测试配置文件配置是否有误如果提示成功,我们分别启动tomcat1 tomcat2 tomcat3,
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="10"
maxInactiveInterval="60"/>