【腾讯云的1001种玩法】Nginx网站服务器学习与入门

Nginx简介

近年来,Nginx在国内取得了突飞猛进的发展,很多门户网站开始提供Nginx解决方案。Nginx是一款开源的高性能HTTP服务器和反向代理服务器,同时支持IMAP/POP3代理服务。由俄罗斯设计师在2002年开发,2004年发布第一个版本。Nginx以其高性能,高可用,丰富的功能模块,简单明了的配置文档以及占用较低系统资源而著称。其采用最新的网络I/O模型,支持高达50000个并发连接。

Nginx 是一个安装非常的简单、配置文件非常简洁、Bug非常少的服务器。Nginx 启动容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。在不间断服务的情况下还可以进行软件版本的升级。

Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

Nginx软件的安装及指令

Nginx软件包使用源码编译安装。需要提前将其依赖包进行安装。

  1. 安装依赖包[root@cc]# yum -y insstall gcc gcc-c++ make pcre pcre-devel openssl zlib
  2. 源码包编译安装Nginx,在官网下载http://nginx.org[root@cc]# tar -xf nginx-1.8.0.tar.gz -C /usr/local/ //解包 [root@cc]# cd /usr/local/nginx-1.8.0 [root@cc]# ./configure --with-http_ssl_module //配置 [root@cc]# make //编译 [root@cc]# make install //安装
  3. 将nginx程序做个软连接,方便执行[root@cc]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin //连接

Nginx软件包采用的是模块化的设计,模块分为内置模块和第三方模块。

Nginx服务器安装好之后,程序的主目录在/usr/local/nginx下,该目录下分别为conf(主配置文件目录),html(网页根目录),logs(日志文件目录),sbin(主程序目录)。Nginx默认无执行脚本,需要手动输入命令来管理。常用的命令如下:

  1. 启动主程序[root@cc]# nginx
  2. 关闭主程序[root@cc]# nginx -s stop
  3. 重载nginx配置[root@cc]# nginx -s reload

配置文件解析

nginx主配置文件为/usr/local/nginx/conf/nginx.conf,配置文件包括全局,event,http,server设置。event主要用来定义Nginx工作模式,http提供Web功能,server用来设置虚拟主机,server必须位于http内部,一个配置文件可以由多个server,一个server表示一个虚拟主机。虚拟主机包括三种类型:基于域名的虚拟主机,基于IP的虚拟主机,基于端口的虚拟主机。

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
    #user  nobody;                                      //设置用户和组
    worker_processes  1;          //启动子进程,通过 ps -aux | grep nginx
    #error_log  logs/error.log;                  //错误日志文件,以及日志级别
    #error_log  logs/error.log  notice;                    
    #error_log  logs/error.log  info;
#pid        logs/nginx.pid;                          //进程号
events {                              <em style="font-style:italic">//工作模式,每个进程可以处理的连接数</em>
    worker_connections  1024;                             
}

http {                                                 
        include       mime.types;                       <em style="font-style:italic">//为文件类型定义文件</em>
        default_type  application/octet-stream;         <em style="font-style:italic">//默认文件类型   </em>

        #log_format  main  &#39;$remote_addr - $remote_user
        [$time_local] &#34;$request&#34;                        <em style="font-style:italic">//创建访问日志</em>
        #&#39;$status $body_bytes_sent &#34;$http_referer&#34; &#39;
        #&#39;&#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;;

        #access_log  logs/access.log  main;

        sendfile        on;
        #tcp_nopush     on;

        #keepalive_timeout  0;                             
        keepalive_timeout  65;                               
        <em style="font-style:italic">//保持连接的超时时间  </em>

        #gzip  on;                                          
        <em style="font-style:italic">//是否启用压缩功能</em>

        server {                                             <em style="font-style:italic">//定义虚拟主机</em>
                listen       80;                             <em style="font-style:italic">//监听端口</em>
                server_name  localhost;                      <em style="font-style:italic">//主机名</em>

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

                location / {                                      
                <em style="font-style:italic">//对URL进行匹配,支持正则</em>
                    root   html;
                    index  index.html index.htm;
                    }

            #error_page  404              /404.html;           
            <em style="font-style:italic">//设置错误代码对应的错误页面</em>

            # redirect server error pages to the static page /50x.html
            #
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                root   html;
                }

            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {                                
            <em style="font-style:italic">//若用户访问的是动态页面,则nginx找主机的9000端口,即交给php处理,</em>
            <em style="font-style:italic">//通过proxy_pass实现代理功能</em>
            #    proxy_pass   http://127.0.0.1;
            #}

            # pass the PHP scripts to FastCGI server listeningon
            #17.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}

            # deny access to .htaccess files, if Apache&#39;s document root
            # concurs with nginx&#39;s one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
    }
        # another virtual host using mix of IP-, name-, 
        #and port-based configuration
        #
        #server {                                              
        <em style="font-style:italic">//定义另一个虚拟主机</em>
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
     #}
   # HTTPS server
    #
    #server {                                              
    <em style="font-style:italic">//定义https安全网页</em>
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

Nginx基本应用

  1. 搭建Nginx服务器
  2. Nginx配置用户认证登陆网页
  3. Nginx配置加密网站
  4. Nginx虚拟站点

Nginx高级应用

1. Nginx反向代理实现集群负载均衡

Nginx除了可以作为HTTP后端服务器之外,还是一个高效的反向代理服务器。在负载均衡的架构中,Nginx可以为我们提供非常稳定且高效的基于七层的负载均衡解决方案。可以根据轮询,IP哈希,URL哈希的方式调度后端真实服务器,也支持对后端服务器的健康检查功能。

2. Nginx地址重写规则

地址重写rewrite的概念:
—获得一个来访的URL请求,然后改写成服务器可以处理的另一个URL过程
语法:
rewrite regex replacement [选项]
优势:
—缩短URL,隐藏实际路径提高安全性
—易于用户认证和键入
—易于被搜索引擎收录
用途:
—当网站文件移动或者文件目录名称发生改变时,出于SEO(搜索引擎优化)需要,你需要保持旧的URL。
—网站改版,或者网站导航和连接发生改变,为了持续持有源连接带来的流量,需要保持旧的URL。

Nginx基本应用实例

1. 搭建Nginx服务器

在IP地址为192.168.4.5的主机上安装部署Nginx服务。

方案:使用2台RHEL7虚拟机,其中一台作为Nginx服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.100),如图1所示。

操作:配置文件无需更改,直接启动服务。

代码语言:javascript
复制
[root@cc]# nginx                                            //启动服务  
[root@cc]# nginx -s reload //重载配置

客户端访问:

代码语言:javascript
复制
[root@cc]# firefox http://192.168.4.5

访问结果如图2:

2. 配置网站用户认证访问

操作:在配置文件里添加用户认证模块,操作如下:

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
#charset koi8-r;
//支持中文字符
auth_basic "Please input name and password to login:"; //提示信息
auth_basic_user_file pass.txt;
//帐号密码文件
[root@cc]# nginx -s reload //重载配置
[root@cc]# htpasswd -cm /usr/loca/nginx/conf/pass.txt Mayweis
//生成密码文件
New password:
Re-type new password:
//Adding password for user Maiweis 输入两遍密码

客户端访问:

代码语言:javascript
复制
[root@cc]# firefox http://192.168.4.5

访问结果如图3:

3.Nginx虚拟主机

要求:配置基于域名的Nginx虚拟主机

操作:操作如下:

1.搭建一个DNS服务器

代码语言:javascript
复制
[root@cc]# yum -y install bind bind-chroot                 //安装软件包
[root@cc]# vim /etc/named.conf //修改主配置文件
options {
directory "/var/named";
};

zone "bb.com" { //bb.com域
type master;
file "bb.com.zone";
};

zone "cc.com" { //cc.com域
type master;
file "cc.com.zone";
};
[root@cc]# named-checkconf
//检查语法错误,无错误,无输出
[root@cc]# cp -p /var/named/named.localhost bb.com.zone
//复制一个bb.com.zone 在去修改
[root@cc]# cp -p /var/named/named.localhost cc.com.zone
//复制一个cc.com.zone 在去修改
[root@cc]# vim /var/named/bb.com.zone
//修改bb.com域的地址库文件,增加下面的代码
@ IN NS ns.bb.com.
ns IN A 192.168.4.5
www IN A 192.168.4.5
[root@cc]# vim /var/named/cc.com.zone
//修改cc.com域的地址库文件,增加下面的代码
@ IN NS ns.cc.com.
ns IN A 192.168.4.5
www IN A 192.168.4.5
[root@cc]# named-checkzone bb.com bb.com.zone //检查语法错误
zone bb.com/IN: loaded serial 0
OK
[root@cc]# systemctl restart named //重启named服务

客户端配置DNS服务器:

代码语言:javascript
复制
[root@cc]# vim /etc/resolv.conf
nameserver 192.168.4.5
//指定192.168.4.5为本机的DNS域名解析服务器

客户端测试DNS解析:

代码语言:javascript
复制
[root@cc]# host www.bb.com
www.bb.com has address 192.168.4.5
[root@cc]# host www.cc.com
www.cc.com has address 192.168.4.5

2.修改Nginx配置文件,添加第二个虚拟主机,操作如下:

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc.com;

    location / {
        root   cc;
        index  index.html index.htm;
                }
    }

[root@cc]# mkdir /usr/local/nginx/cc
//创建www.cc.com的网页根目录
[root@cc]# echo "www.bb.com" >/usr/local/nginx/html/index.html //制作主页
[root@cc]# echo "www.cc.com" >/usr/local/nginx/cc/index.html //制作主页

客户端测试:

代码语言:javascript
复制
[root@cc]# curl http://www.bb.com
www.bb.com
[root@cc]# curl http://www.cc.com
www.cc.com

4.Nginx加密网站部署

要求:配置Nginx加密网站

操作:操作如下:

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 443 ssl; //监听https的443端口
server_name www.bb.com;

   ssl_certificate      cert.pem;                      //证书
   ssl_certificate_key  cert.key;                      //私钥
   location / {
       root   html;
       index  index.html index.htm;
   }
}

[root@cc]# nginx -s reload

客户端去访问:

代码语言:javascript
复制
[root@cc]# firefox https://www.bb.com                   //访问时输入https

访问结果如下:

点击我已充分了解可能的风险 最终结果如下: www.bb.com

Nginx高级应用实例

1.Nginx反向代理实现负载均衡 要求:配置Nginx反向代理实现服务器负载均衡。 —后端Web服务器两台,可以使用httpd实现 —Nginx采用轮询的方式调用后端Web服务器 —两台Web服务器的权重要求设置为不同的值 —最大失败次数为1,失败超时时间为30秒

方案:反向代理负载均衡拓扑结构如图4:

操作:操作如下:

  1. 准备两个后端的Apache服务器,提供http服务。web1的ip地址为192.168.2.100,web2的ip地址为192.168.2.200。配置web1的http服务操作如下:[root@cc]# yum -y install httpd //装包 [root@cc]# echo "web1" > /var/www/html/index.html //配置主页 [root@cc]# systemctl restart httpd //启服务 [root@cc]# netstat -antup | grep 80 //检查监听端口
  2. web2的配置如下:[root@cc]# yum -y install httpd //装包 [root@cc]# echo "web2" > /var/www/html/index.html //配置主页 [root@cc]# systemctl restart httpd //启服务 [root@cc]# netstat -antup | grep 80 //检查监听端口
  3. 在代理服务器上配置Nginx反向代理服务器,操作如下:[root@cc]# vim /usr/local/nginx/conf/nginx.conf ... http { upstream webs { //定义web集群 server 192.168.2.100 weight=2 max_fails=2 fail_timeout=10; server 192.168.2.200 max_fails=2 fail_timeout=10; //最大失败数2,失败超时时间10s,192.168.2.100权重为2 } location / { //网页根目录 root html; proxy_pass http://webs; //指定为代理服务器 index index.html index.htm; } } [root@cc]# nginx -s reload //重载配置 客户端测试反向代理负载均衡,效果如图5:

2.Nginx地址重写规则案例

  1. a.html---->b.html 操作如下:[root@cc]# vim /usr/local/nginx/conf/nginx.conf rewrite a.html /b.html; //加在server里 [root@cc]# echo "BBB" > /usr/local/nginx/html/b.html [root@cc]# nginx -s reload 客户端访问:[root@cc]# firefox http://192.168.4.5/a.html 结果如下:

2.访问192.168.4.5.跳转到www.qq.com 操作如下:[root@cc]# vim /usr/local/nginx/conf/nginx.conf rewrite ^/ http://www.qq.com ; //加在server里 [root@cc]# nginx -s reload 客户端访问:[root@cc]# firefox http://192.168.4.5/ 结果如下:

3.根据用户不同的浏览器,访问相同页面,返回不同的结果 firefox http://192.168.4.5 返回firefox curl http://192.168.4.5 返回curl 操作如下:

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
if($http_user_agent ~ firefox){
        rewrite ^/(.*) /firefox/$1;        
        }                        ;                    //加在server里
if($http_user_agent ~ curl){
        rewrite ^/(.*) /curl/$1;        
        } 
[root@cc]# mkdir /usr/local/nginx/html/{firefox,curl}  //创建目录
[root@cc]# echo "firefox" >/usr/local/nginx/firefox/test.html//部署主页
[root@cc]# echo "curl" > /usr/local/nginx/curl/test.html
[root@cc]# nginx -s reload

客户端访问:

代码语言:javascript
复制
[root@cc]# firefox http://192.168.4.5/
firefox
[root@cc]# firefox http://192.168.4.5/
curl

4.如果文件不存在,则调转到首页 操作如下:

代码语言:javascript
复制
[root@cc]# vim /usr/local/nginx/conf/nginx.conf
if(!-e $request_filename){
        rewrite ^/ http://192.168.4.5/;        
        }                        ;                    //加在server里
[root@cc]# nginx -s reload

客户端访问: 客户端访问:

代码语言:javascript
复制
[root@cc]# firefox http://192.168.4.5/dsad       //随便输入文件名

结果如下:

rewrite语法选项详解: rewrite regex replacement [选项] 选项:break , last, redirect, permanent —break:停止执行其他的重写规则,完成本次请求 —last:停止执行其他重写规则,根据URL继续搜索其他location,地址栏不改变 —redirect :302临时重定向,地址栏改变,爬虫不更新URL —permanent:301永久重定向,地址栏改变,爬虫更新URL

Nginx总结

Nginx是一个轻量级的web服务器,同样起web 服务,比apache 占用更少的内存及资源,功能很强大,应用也很广泛。高度模块化的设计,编写模块相对简单。目前越来越受到人们的喜爱。