初识Nginx

2018-04-04|Categories: Cluster, Linux|Tags: |

为什么要使用Nginx

先看看维基百科Nginx条目性能小节的描述:

Nginx was written with an explicit goal of outperforming the Apache web server.

翻译过来就是,Nginx生来就是为了获得比Apache httpd更好的性能。这不是吹牛,Nginx确实做到了,有图为证:

图一:内存占用对比

图二:每秒处理请求数对比

以上图片以及测试详情来自 https://help.dreamhost.com/hc/en-us/articles/215945987-Web-server-performance-comparison

从图上可以看到,当并发连接达到2500个的时候:

  • Apache内存占用1800M,而Nginx不到150M,大约只有前者的8%;
  • Apache每秒处理请求不到1000个,而Nginx可以达到7500个,是前者的7.5倍!

超强的性能和超低的资源占用,这就是选择Nginx的首要原因

不仅如此,Nginx还更加易用。有Nginx专家激动的说:

Apache is like Microsoft Word. It has a million options but you only need six. NGINX does those six things, and it does five of them 50 times faster than Apache.

这里是讽刺Apache就像微软的Word办公软件一样臃肿、缓慢:Word有「一百万种」功能,而你仅仅需要其中的6个;Nginx只提供那6个你需要的功能,但其中5个比Apache快50倍。

安装Nginx

从EPEL源安装

EPEL提供的版本是1.12.2(稳定版),官方发布于2017-10-17:

yum install -y nginx

启动Nginx:

nginx

从官方源安装(主线版)

主线版(Mainline version)就是最新版。先配置yum仓库:

vim /etc/yum.repos.d/nginx.repo

粘贴以下内容:

[nginx]
name=nginx repo
# Stable version
#baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
# Mainline version
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

安装:

yum install nginx --disablerepo='epel' --enablerepo='nginx'

官方还提供了其它发行版的预编译软件包:http://nginx.org/en/linux_packages.html#stable

配置虚拟主机

注:

  • 以下实验基于EPEL安装的Nginx。
  • 虚拟主机(Virtual host)是Apache的术语,Nginx的对应术语是「server」。

网络环境

CentOS 7虚拟机配置了两块网卡:

  • eth0动态获取IP地址:192.168.3.141
  • eth1设置静态IP地址:172.16.125.71
$ ip a | grep -E 'inet\b'
    inet 192.168.3.141/23 brd 192.168.3.255 scope global dynamic eth0
    inet 172.16.125.71/24 brd 172.16.125.255 scope global eth1

基于端口的虚拟主机

为了便于管理多个虚拟主机,我把每个虚拟主机的配置文件单独存放,而不是全部写入Nginx主配置文件。

# 编辑Nginx主配置文件
vim /etc/nginx/nginx.conf
# 修改http配置块
http {
    # 省略EPEL源预设值
    log_format main ...;
    # 在log_format指令下方添加导入虚拟主机独立配置文件的指令,
    # 便于在虚拟主机中引用log_format定义的日志格式
    include /etc/nginx/vhosts/*.conf;
}

# 创建存放虚拟主机独立配置文件的目录
mkdir /etc/nginx/vhosts

# 创建虚拟主机A的配置文件
vim /etc/nginx/vhosts/nginx_a.conf
# 只需要一个server块、添加listen和root两行指令
server {
    listen 81;
    root /usr/share/nginx/html/vhosts/a/;
}

# 创建虚拟主机A的web资源根目录
mkdir -p /usr/share/nginx/html/vhosts/a

# 创建虚拟主机A的web主页
vim /usr/share/nginx/html/vhosts/a/index.html
# 添加主页内容
<h1>vhost.a.com</h1>
<p>based on port</p>

# 检查所有配置文件的语法
nginx -t
# 重新读取所有配置文件
nginx -s reload

# 访问(测试)虚拟主机
curl 172.16.125.71:81

基于IP的虚拟主机

步骤同上:

vim /etc/nginx/vhosts/nginx_b.conf
    server {
        listen 192.168.3.141;
        root /usr/share/nginx/html/vhosts/b/;
    }

mkdir -p /usr/share/nginx/html/vhosts/b

vim /usr/share/nginx/html/vhosts/b/index.html
    <h1>vhost.b.com</h1>
    <p>based on ip</p>

nginx -t
nginx -s reload

curl 192.168.3.141

基于域名的虚拟主机

基于域名的虚拟主机需要配置本地/etc/hosts文件,将测试域名解析到测试IP地址。

vim /etc/nginx/vhosts/nginx_c.conf
    server {
        server_name c.com www.c.com;
        root /usr/share/nginx/html/vhosts/c/;
    }

vim /etc/hosts
# 添加一行记录
172.16.125.71 www.c.com c.com
# 此处不能把域名解析到192.168.3.141,
# 因为前面「基于IP」的实验已经配置了192.168.3.141的root是`vhosts/b`这个目录,
# 优先级更高
#
# 如果一定要解析到192.168.3.141,
# server块内必须添加`listen www.c.com:80 default_server;`,
# 但此时「基于IP」的虚拟主机会失效

mkdir -p /usr/share/nginx/html/vhosts/c
vim /usr/share/nginx/html/vhosts/c/index.html
    <h1>vhost.c.com</h1>
    <p>based on domain name</p>

nginx -t
nginx -s reload

curl www.c.com

Leave A Comment