前一篇文章 Windows下安装与使用Nginx (1) 介绍了在windows环境下Nginx的安装与使用,因我本人对linux并不熟悉,所以先以window环境试水,花了一天的时间将linux环境下的Nginx建起来,仍旧以博客记录建置的过程,供后来者参考,也给自己留个笔记.
环境准备
使用工具
- winscp : 在windows环境下直接连linux进行文件传送,文件夹/文件新增修改删除,大大方便了在linux上进行文件相关的操作.
- putty : 远程连接linux,连接后在本机使用命令行远程操作即可.
Linux基础环境相关
- gcc & g++
1.判断是否安装了gcc&g++
# rpm -qa | grep gcc
若有出现以下三个包,则无需安装,否则需要执行2的操作安装这三个包.
2.若没有可使用putty远程连接linux服务器之后,使用yum命令在线安装,用该方式安装依赖linux服务器需有外网访问权限.
# yum -y install gcc-c++
-y为自动选择y,当有询问选择y/n时自动选择y
- pcre
1.下载地址:https://nchc.dl.sourceforge.net/project/pcre/pcre/8.12/pcre-8.12.tar.gz
2.使用winscp上传pcre-8.12.tar.gz 到 /usr/local/src/nginx目录下
3.解压pcre-8.12.tar.gz
# cd /usr/local/src/nginx
# tar zxvf pcre-8.12.tar.gz
4.进入解压后的目录
# cd pcre-8.12
5.配置
# ./configure
6.编译
# make
7.安装
# make install
- 修改防火墙配置开放nginx端口
默认状态下只开放22端口供ssh连接,所以需要开放nginx使用的端口,否则其他主机无法连接.
查看端口开放状况
# vim + /etc/sysconfig/iptables
若nginx端口没有开放,修改防火墙配置,事实上,我是复制了22端口的那笔记录,修改成自己要开放的端口,修改完之后保存退出,然后重启防火墙.
# service iptables restart
Nginx
1.下载地址: http://nginx.org/en/download.html
2.使用winscp上传nginx-1.8.1.tar.gz 到 /usr/local/src/nginx目录下
测试站点
安装Nginx
参考这位前辈的做法 http://www.cnblogs.com/kevingrace/p/5882006.html
1.添加用户nginx,用于运行nginx服务进程
# groupadd -r nginx
# useradd -r -g nginx -s /bin/false -M nginx
2.解压nginx-1.8.1.tar.gz
# cd /usr/local/src/nginx
# tar zxvf nginx-1.8.1.tar.gz
3.进入解压后的目录
# cd nginx-1.8.1
4.配置
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
补充:在这里我遇到了OpenSSL的异常,提示如下:
解决方式是安装OpenSSL,指令如下:
yum -y install openssl openssl-devel
5.编译
# make
6.安装
# make install
至此,nginx服务算是安装完成了,切换到nginx的安装目录,我们可以看到安装目录下有以下文件:
# cd /usr/local/nginx/
# ls
开启nginx,访问http://nginx_ip/,出现默认的页面.
# cd sbin
# ./nginx
配置Nginx负载均衡
配置文档详细说明: 参考http://www.linuxidc.com/Linux/2013-11/92594.htm
Nginx配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location(URL匹配特定位置的设置).
其中,main部分设置将会影响其他所有设置,server部分的指令主要用于指定主机和端口。upstream指令主要用于负载均衡,设置一系列的后端服务器,location部分主要用于匹配网页位置。四者的关系如下:server继承main,location继承server,upstream既不继承其他设置,也不被设置所继承。
1、nginx的全局配置
下面这段代码内容是nginx全局属性的配置
user nobody; #指定nginx worker进程运行用户以及用户组,默认nobody。
worker_processes 1; #指定nginx要开启的进程数。最好与CPU个数相同。
error_log logs/error.log notice; #用来定义全局错误日志文件。级别有:debug、info、notice、warn、error和crit。debug输出日志最为详细,criti输出日志最少。
pid logs/nginx.pid; #用来指定进程id的存储文件位置。
events { #设定nginx的工作模式及连接上限。
use epoll; #支持的工作模式有:select、poll、kqueue、epoll和rtsig.对于linux系统,epoll是首选模式。
worker_connections 1024; #定义nginx每个进程的最大连接数。
}
2、HTTP服务器配置
http {
include mime.types; #实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
default_type application/octet-stream; #设定默认类型为二进制流
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #指定nginx日志的输出格式,main为此日志文件输出格式的名称,可以在下面access_log指令中引用
access_log logs/access.log main;
sendfile on; #用于开启高效文件传输模式
tcp_nopush on; #防止TCP阻塞
keepalive_timeout 0; #用于设置客户端连接保持活动的超时时间,超过这个时间,服务器会关闭该连接
keepalive_timeout 65; #同上
gzip on; #支持压缩传输,提高传输速度
server { #server{}第一个虚拟主机
listen 80; #监听端口
server_name localhost; #主机头(域名)
charset utf-8; #web服务器的语言编码
access_log logs/host.access.log main; #虚拟主机独立的访问日志
location / { #匹配url地址中有"/",则执行花括号中的配置
root html; #虚拟主机的本地目录,完整路径/opt/nginx/html也可写绝对路径
index index.html index.htm; #默认索引的首页格式及顺序
proxy_pass http://localhost:59637; #请求转向的地址
}
error_page 500 502 503 504 /50x.html; #定义错误页面
location = /50x.html {
root html;
}
}
}
3、upstream负载均衡配置
这里说明两种负载均衡模式:
(1)轮询加权,也可以不加权,就是1:1轮询
(2)ip_hash,同一ip会被分配给固定的后端服务器,当session保存在IIS进程中的时候,可使用这种方式.但当某一台后端服务器挂掉的时候,session则会丢失.
upstream myweb {
#ip_hash #使用ip hash分配模式
server 192.168.18.117:111 weight=1; #站点A
server 192.168.18.117:222 weight=2; #站点B
}
基于我的需求,需要达到真正的负载平衡,也就是当某一台挂掉时,原来连接到挂点服务器的使用者仍可以正常使用,所以我采用轮询的负载均衡模式,并且我需要将session独立存储(asp.net使用redis存储session),我的配置修改为:
upstream myweb {
server 192.168.18.117:111 weight=1; #站点A
server 192.168.18.117:222 weight=1; #站点B
}
location / {
root html;
index index.html index.htm;
proxy_pass http://myweb; #指向upstream配置
}
最后附加nginx常用指令
# cd /usr/local/nginx/sbin 切换到nginx目录
# ./nginx -s stop 强制关闭
# ./nginx -s quit 安全关闭
# ./nginx -t 检查配置文件是否正确
# ./nginx -s reload 改变配置文件后重新加载配置,不需要重启nginx
# ./nginx -s reopen 打开日志文件
或者
# /usr/local/nginx/sbin/nginx -s stop 强制关闭
# /usr/local/nginx/sbin/nginx -s quit 安全关闭
# /usr/local/nginx/sbin/nginx -t 检查配置文件是否正确
# /usr/local/nginx/sbin/nginx -s reload 改变配置文件后重新加载配置,不需要重启nginx
# /usr/local/nginx/sbin/nginx -s reopen 打开日志文件
测试
至此,我的nginx负载平衡可以正常工作啦,当我第一次访问时,实际上访问的是站点A,第二次访问时,实际上访问的是站点B.
写在最后
这篇文章是最简单的负载均衡的配置过程,后续将加入session存储到redis,nginx缓存设置,与keepalive结合等主题,实现真正的web服务高可用.