Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。

# 【Nginx】高并发Web容器Nginx的使用

Nginx(发音同engine x)是一个 WEB容器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑(这一点与NodeJS采取了相同的做法,支持高并发,Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中,是可以支持二万至四万个平行链接),削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。

使用 Nginx 的方法就是写配置文件,配置文件能完全控制 Nginx,使 Nginx 按照我们的需求进行运行,所以配置文件的每一项的是干啥的对我们来说就很重要了。

# 安装

# 阿里云CentOS中安装

在 CentOS 中安装 nginx

yum -y install nginx
$ whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

相关目录

  • nginx 的配置文件位于 /etc/nginx/nginx.conf
  • nginx 默认站点目录位于 /usr/share/nginx/html

经测试, 在阿里云的 centos 镜像中可直接使用 yum 进行安装, 而本地虚拟机安装的 CentOS 需要一些单独的操作

# CentOS 中安装

在 Centos 默认的标准源里没有 nginx 软件包,所以需要先获取 nginx 源

wget http://www.atomicorp.com/installers/atomic
sh ./atomic
yum check-update
# or
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 使用源码安装

wget http://nginx.org/download/nginx-1.7.3.tar.gz
tar xzf nginx-1.7.3.tar.gz
cd nginx-1.7.3
./configure
make && make install
$ whereis nginx
nginx: /usr/local/nginx

源码安装 nginx 的二进制文件位于 /usr/local/nginx/nginx

# 在Docker中安装

拉取nginx镜像

docker pull nginx # 拉取nginx镜像
mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf # 创建目录存放容器内文件

先创建一个空容器, 获取里面的某些文件

mkdir -p ~/nginx/log ~/nginx/etc ~/nginx/html # 在宿主机中创建一些目录存放nginx站点
docker run -p 80:80 --name nginx nginx /bin/bash # 创建空容器
docker cp nginx:/etc/nginx/nginx.conf ~/nginx/etc/nginx.conf # 拷贝容器内配置文件到宿主机
docker rm -f nginx

重新创建一个容器, 挂载到刚才创建的目录中

$ docker run -d \
  --name nginx \
  -p 80:80 \
  -v ~/nginx/www:/www \
  -v ~/nginx/data:/data \
  -v ~/nginx/html:/usr/share/nginx/html \
  -v ~/nginx/etc/nginx.conf:/etc/nginx/nginx.conf \
  -v ~/nginx/logs:/wwwlogs \
  nginx
cd ~/nginx/html && echo hello >> index.html # 在宿主机中添加首页
docker exec -it nginx bash # 进入容器
$ curl 127.0.0.1 # 测试
hello

以上命令, 执行以下操作:

  1. 命名一个名叫 nginx 的 docker 容器
  2. 将容器中 80 端口映射到宿主机的 80 端口
  3. 挂载卷, 将宿主机的某些目录映射到容器
  4. 使用镜像 nginx 创建容器并进入

相关目录及文件

  • html: 站点目录
  • logs: 日志目录
  • nginx.conf: 配置文件

# 在浏览器中测试

# 基础操作

  • 启动 nginx 服务: nginxsystemctl start nginx
  • 重新载入配置文件: nginx -s reloadsystemctl reload nginx
  • 停止 nginx 服务: nginx -s stopsystemctl stop nginx
  • 重启 nginx 服务: nginx -s reopensystemctl restart nginx
  • 开机启动 nginx: systemctl enable nginxchkconfig --levels 235 nginx on
  • 查看 nginx 帮助: nginx -h
  • 重新绑定配置文件: nginx -c /etc/nginx/nginx.conf
  • 测试配置文件: nginx -t

检测是否启动成功

$ netstat -ntlp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5967/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      5967/nginx: master

# 将服务端口添加进防火墙

firewall-cmd --add-service=http # 临时开启 http 服务
firewall-cmd --add-service=http --permanent # 永久开启 http 服务
firewall-cmd --add-port=80/tcp # 临时开启 80 端口
firewall-cmd --add-port=80/tcp --permanent # 永久开启 80 端口

# 虚拟站点配置

# 基于域名的虚拟主机

假设我们在本地有2个项目,分别在 /etc/hosts 里映射到本地的 127.0.0.1 上:

127.0.0.1 test1.xiaoyulive.top
127.0.0.1 test2.xiaoyulive.top

这2个项目分别对应于以下的2个文件夹,我们用域名对应文件夹名字,这样子好记:

/usr/nginx/test1.xiaoyulive.top
/usr/nginx/test2.xiaoyulive.top

每个目录下都有一个index.php文件,简单的输入:

# /usr/nginx/test1.xiaoyulive.top
<?php
echo 'hello';
# /usr/nginx/test2.xiaoyulive.top
<?php
echo 'world';

下面我们就来搭建这2个域名的虚拟主机,很显然,我们要新建2个conf文件来完成。

为了看起来简洁好看,我们使用 include 在 nginx.conf 中包含外面的2个conf文件,这样就清晰了很多。不会使得这个 nginx.conf 内容太多:

main
events {
  ....
}
http {
  ....
  include /etc/nginx/vhost/test1.xiaoyulive.top;
  include /etc/nginx/vhost/test2.xiaoyulive.top;
  # 或者用 *.conf  包含某个文件夹下的所有 conf 文件
  # include /etc/nginx/vhost/*.conf
}

然后撰写两个conf文件:

# /etc/nginx/vhost/test1.xiaoyulive.top
server {
    listen 80;
    server_name test1.xiaoyulive.top;
    root /usr/nginx/test1.xiaoyulive.top;
    index index.php index.html index.htm;
    access_log /usr/local/var/log/nginx/test1.xiaoyulive.top.log main;
    error_log /usr/local/var/log/nginx/test1.xiaoyulive.top.log error;
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi.conf;
    }
}
# /etc/nginx/vhost/test2.xiaoyulive.top
server {
    listen 80;
    server_name test2.xiaoyulive.top;
    root /usr/nginx/test2.xiaoyulive.top;
    index index.php index.html index.htm;
    access_log /usr/local/var/log/nginx/test2.xiaoyulive.top.log main;
    error_log /usr/local/var/log/nginx/test2.xiaoyulive.top.log error;
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi.conf;
    }
}

这样2个很精简的虚拟域名就搭建好了。重启下nginx,然后打开浏览器访问一下这2个域名,就能看到对应的域名内容了。

# 基于IP的距离主机

为本机绑定多个IP以便于测试:

ifconfig ens33:1 192.168.2.151/24 up
ifconfig ens33:2 192.168.2.152/24 up
ifconfig ens33:3 192.168.2.153/24 up

创建三个站点目录并写入文件:

mkdir www && cd www
mkdir test1
mkdir test2
mkdir test3
echo 'test1' > test1/index.html
echo 'test2' > test2/index.html
echo 'test3' > test3/index.html

创建3个虚拟主机文件:

$ vim /etc/nginx/conf.d/test1.conf
server {
    listen       192.168.2.151:80;
    location / {
        root   /root/www/test1;
        index  index.html index.htm;
    }
}
$ vim /etc/nginx/conf.d/test2.conf
server {
    listen       192.168.2.152:80;
    location / {
        root   /root/www/test2;
        index  index.html index.htm;
    }
}
$ vim /etc/nginx/conf.d/test3.conf
server {
    listen       192.168.2.153:80;
    location / {
        root   /root/www/test3;
        index  index.html index.htm;
    }
}

测试

$ curl 192.168.2.151
test1
$ curl 192.168.2.152
test2
$ curl 192.168.2.153
test3

# 基于端口的虚拟主机

还是创建两个虚拟站点:

echo 'test1' > /root/www/test1/index.html
echo 'test2' > /root/www/test2/index.html

这个就很容易了, 不需要更多额外的操作, 直接在配置文件中指定端口即可:

$ vim /etc/nginx/conf.d/test1.conf
server {
    listen       127.0.0.1:8081;
    location / {
        root   /root/www/test2;
        index  index.html index.htm;
    }
}
$ vim /etc/nginx/conf.d/test2.conf
server {
    listen       127.0.0.1:8082;
    location / {
        root   /root/www/test2;
        index  index.html index.htm;
    }
}

测试:

$ curl 127.0.0.1:8081
test1
$ curl 127.0.0.1:8082
test2

# 配置Nginx以支持PHP

首先安装一堆 php 及相关组件

yum -y install php php-cli php-fpm php-pear php-mysql php-mssql php-odbc php-imap php-common php-devel lighttpd-fastcgi php-gd php-ldapphp-xml php-xmlrpc php-mbstring php-mcrypt php-snmp php-soap php-tidy

# 开启PHP服务

systemctl start php-fpm

查看是否启动成功

$ ps -ef | grep php-fpm
root      20153      1  0 21:26 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
apache    20154  20153  0 21:26 ?        00:00:00 php-fpm: pool www
apache    20155  20153  0 21:26 ?        00:00:00 php-fpm: pool www
apache    20156  20153  0 21:26 ?        00:00:00 php-fpm: pool www
apache    20157  20153  0 21:26 ?        00:00:00 php-fpm: pool www
apache    20158  20153  0 21:26 ?        00:00:00 php-fpm: pool www
root      20924  20650  0 21:38 pts/1    00:00:00 grep --color=auto php-fpm
$ netstat -ntlp | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

php-fpm 默认监听 9000

# php-fpm 开机启动

chkconfig --levels 235 php-fpm on

# 配置 nginx.conf

首先最好备份 nginx.conf,以防出错

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak

编辑 /etc/nginx/conf.d/default.conf

server {
  listen       80;
  server_name  localhost;
  location / {
    root   /usr/share/nginx/html;
    index  index.php index.html index.htm; #增加index.php
  }
  #error_page  404              /404.html;
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
  location ~ \.php$ {
    root           /usr/share/nginx/html; #修改为nginx默认路径
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
    include        fastcgi_params;
  }
}

配置php,编辑 /etc/php.ini 文件,找到以下语句放开注释

$ vim /etc/php.ini
cgi.fix_pathinfo = 1

重启 nginx,php-fpm

systemctl restart nginx
systemctl restart php-fpm

建立info.php文件

$ vim /usr/share/nginx/html/info.php
<?php
  phpinfo();

此时,就可以在浏览器中访问 php 文件了。

# URL重写

# 页面缓存

# 参考资料

安装与配置

虚拟主机

负载均衡与反向代理

Docker

问题解决

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress