Nginx专题: 从编译安装到URL重写

Nginx专题: 从编译安装到URL重写

前言

本文主要实现使用Nginx作为Web服务器, 并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中

环境介绍

笔者只有一台虚拟机, 桥接到室内的路由器便于手机进行访问, IP地址为192.168.1.103

Nginx介绍

engine x发音同Nginx, 作者是Igor Sysoev,是目前世界上占有率第三的Web服务器软件. Nginx是一款轻量级的Web服务器,可实现反向代理,URL rewrite等功能。Nginx拥有消耗内存小、可支持高并发连接达5W个、还支持热部署、高性能的网络IO模型等特性。淘宝还基于Nginx进行二次研发出Tengine

编译安装Nginx

需要安装Development ToolsServer Platform Development包组和zlib-devel, pcre-devel, openssl-devel等包

[root@server1 ~]# yum groupinstall "Development Tools" "Server Platform Development" #安装包组
[root@server1 ~]# yum install pcre-devel openssl-devel zlib-devel -y   #安装相应软件
[root@server1 ~]# tar xf nginx-1.6.1.tar.gz  -C /usr/src/  #解压nginx源码包到/usr/src/目录中
[root@server1 ~]# cd /usr/src/
[root@server1 src]# cd nginx-1.6.1/
[root@server1 nginx-1.6.1]# groupadd -r nginx   #创建组
[root@server1 nginx-1.6.1]# useradd -r -g nginx nginx   #创建用户
[root@server1 nginx-1.6.1]# ./configure --prefix=/usr/src/nginx --sbin-path=/sbin/ --conf-path=/etc/nginx/nginx.conf --with-http_ssl_module --user=nginx --group=nginx --with-http_gzip_static_module
   #关于编译选项的参数含义,请查阅官方文档
[root@server1 nginx-1.6.1]# make && make install

配置文件解释

关于Nginx的一些工作原理我们这里不做解释,但是我们解释一下Nginx的配置文件中常用选项的意思 
nginx的主配置文件是nginx.conf,配置文件的位置随着编译的配置选项而定,我们这里是/etc/nginx/nginx.conf文件

Nginx作为web服务器时主配置文件一般分为三段, main和event{}, http{}、我们分别进行介绍

main和event{}的配置

运行相关的配置
   user User_Name [Group_name];  #运行Nginx进程的用户和组. 默认为nobody
   error_log /path/to/error_log;  #是否启用错误日志,并指定错误日志的存放位置, 可指定为相对路径
   error_log /path/to/error_log notice;  #指定错误日志的记录的级别
   pid /path/to/pidfile; #指定守护进程pid文件的位置  

性能相关的配置
   worker_processes number;   #运行的worker进程的个数, 默认为1    
   worker_cpu_affinity cpumask ...; #定义worker进程和cpu的绑定, 这里不做过多介绍, 不了解的可自行查找
   time_resolution interval ; 计数器的解析度,记录日志时时间的精确性
   worker_priority number; #worker进程的优先级

事件相关的配置
   accept_mutex on|off;   #master进程调度用户请求至worker进程的算法,轮询和随机. on表示轮询
   use [epoll|rtsing|select|poll];   #指明使用的事件驱动模型
   worker_connections number; 指明一个worker进程能够接受的最大请求书

http{}的基本配置

    1. server{}: 定义一个虚拟主机
       示例:
           server {
               listen 80;
               server_name www.anyisalin.com;
               root "/htdocs/www"
               }
   2. listen
       语法: listen address[:port];
       示例:
           listen 127.0.0.1:8000;
           listen 127.0.0.1;
           listen 8000;
           listen *:8000;
           listen localhost:8000;          
   3. server_name
       语法: server_name name...;
       支持通配符:
           匹配顺序:
               1. 精确匹配        
               2. 从左向右匹配通配符   *.anyisalin.com
               3. 从右向左匹配通配符   anyisalin.*
               4. 匹配正则表达式      ~^*\.anyisalin\.com$
               5. default_server

   4. root
       语法: root path;

   5. location
       语法: location [=] [~] [~*] [^~] URL {...}
       功能:根据用户请求的URI来匹配定义的location
           =: 精确匹配检查
           ~: 正则表达式匹配
           ~*: 正则表达式匹配, 不区分大小写
           ^~: URI的前半部分匹配, 不支持正则表达式

           示例:
               server {
                   listen 80;
                   server_name www.anyisalin.com;
                   location / {
                       root "/htdocs/www";
                       }      
                   location /imgs/ {
                       root "/htdocs/imgs"
                       }
                   location ~* \.php$ {
                       root "/htdocs/php"
                       }
                   }

配置Nginx

搭建一个基本的Nginx Web服务器

编辑Nginx配置文件效果如下

 server {
     listen       80;
       server_name  www.anyisalin.com;

       location / {
           root   /htdocs/html;
           index  index.html index.htm;
           error_page 404 =200 404.html;
           }
       }

创建对应网页文件

[root@server1 /]# mkdir htdocs/html -pv     #创建文件夹
   mkdir: created directory `htdocs'
   mkdir: created directory `htdocs/html'

[root@server1 /]# cd htdocs/html/
[root@server1 html]# echo "<h1>www.anyisalin.com</h1>" >>  index.html   #创建网页文件
[root@server1 html]# echo "Sorry, Page Not Found" > 404.html    #创建404页面
[root@server1 html]# nginx -t   #检查配置文件语法
   nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
   nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@server1 html]# nginx  #启动nginx

测试页面访问正常

blob.png

blob.png

实现https

创建CA并签署Nginx证书

这里对于openssl的操作不做解释, 有兴趣可以看我以前的文章: AnyISalIn的文章

创建私有CA并自签证书

[root@server1 html]# cd /etc/pki/CA
[root@server1 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
[root@server1 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [XX]:CN
   State or Province Name (full name) []:AH
   Locality Name (eg, city) [Default City]:HF
   Organization Name (eg, company) [Default Company Ltd]:AnyISalIn LTD
   Organizational Unit Name (eg, section) []:ops
   Common Name (eg, your name or your server's hostname) []:www.anyisalin.com
   Email Address []:webadmin.anyisalin.com

[root@server1 CA]# touch serial index.txt
[root@server1 CA]# echo 01 > serial

创建nginx证书

[root@server1 CA]# cd /etc/nginx/
[root@server1 nginx]# mkdir ssl
[root@server1 nginx]# cd ssl/
[root@server1 ssl]# (umask 077; openssl genrsa -out nginx.key 1024)
Generating RSA private key, 1024 bit long modulus
..++++++
.............................................................................................++++++
e is 65537 (0x10001)
[root@server1 ssl]# openssl req -new -key nginx.key -out nginx.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:AH
Locality Name (eg, city) [Default City]:HF
Organization Name (eg, company) [Default Company Ltd]:AnyISalIn LTD
Organizational Unit Name (eg, section) []:ops    
Common Name (eg, your name or your server's hostname) []:www.anyisalin.com
Email Address []:webadmin.anyisalin.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

签署证书

[root@server1 ssl]# openssl ca -in nginx.csr -out nginx.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
       Serial Number: 1 (0x1)
       Validity
           Not Before: Apr  4 13:57:02 2016 GMT
           Not After : Apr  4 13:57:02 2017 GMT
       Subject:
           countryName               = CN
           stateOrProvinceName       = AH
           organizationName          = AnyISalIn LTD
           organizationalUnitName    = ops
           commonName                = www.anyisalin.com
           emailAddress              = webadmin.anyisalin.com
       X509v3 extensions:
           X509v3 Basic Constraints:
               CA:FALSE
           Netscape Comment:
               OpenSSL Generated Certificate
           X509v3 Subject Key Identifier:
               A3:68:8D:FD:49:FD:08:1B:E3:09:45:9F:3B:48:35:1E:0F:38:C4:92
           X509v3 Authority Key Identifier:
               keyid:26:2E:FE:F6:52:41:DC:2F:C6:C1:4F:19:A0:BE:F6:14:99:93:54:4B

Certificate is to be certified until Apr  4 13:57:02 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

修改配置文件

    server {
       listen       443 ssl;
       server_name  www.anyisalin.com;
       ssl_certificate      /etc/nginx/ssl/nginx.crt;
       ssl_certificate_key  /etc/nginx/ssl/nginx.key;


       location / {
           root   /htdocs/html;
           index  index.html index.htm;
           error_page 404 =200 404.html;
           }

       }

测试https

重载服务进行测试

[root@server1 ssl]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@server1 ssl]# nginx -s reload

未导入证书前

blob.png

导入证书后,因为chrome自身问题认为证书不可靠,但是已经成功

blob.png

实现URL Rewrite将不同浏览器的请求响应不同页面

URL重写的相关配置选项

    语法:rewrite regex replacement flag;

   例如:
       rewrite ^/images/(.*\.jpg)$ /img/abc/$1 break;

   效果:
       http://www.anyisalin.com/images/1.jpg --> http://www.anyisalin.com/img/abc/1.jpg

   flag:
       last: 被重写完后不会继续匹配下面的rewrite规则, 由User_agent重新发起对新URL的请求, 但是会重新匹配rewrite规则
       break:被重写后不会继续匹配下面的rewrite规则, 由User_agent重新发起对新URL的请求, 但是不会继续匹配
       redirect:以302(临时重定向)返回新的URL
       permanent:以301(永久重定向)返回新的URL

分析日志查看相应用户代理的类型

blob.png

blob.png

针对用户代理URL Rewrite

修改location为如下配置

location / {
root   /htdocs/html;
index  index.html index.htm;
error_page 404 =200 404.html;

      if ($http_user_agent ~* Android) {        #匹配到User_Agent包含Android跳转到/Moblie中
      rewrite ^(.*)$ /Moblie/$1 break;
       }

     if ($http_user_agent ~* Chrome) {         #匹配到User_Agent包含chrome跳转到/Chrome中
     rewrite ^(.*)$ /Chrome/$1 break;
       }

     if ($http_user_agent ~* MSIE) {          #匹配到User_Agent包含MSIE跳转到/IE中
     rewrite ^(.*)$ /IE/$1 break;
       }    

}

创建对应的网页文件

[root@server1 /]# mkdir /htdocs/html/{Chrome,IE,Moblie}
[root@server1 /]# echo "Welecom Moblie" > /htdocs/html/Moblie/index.html
[root@server1 /]# echo "Welecom Chrome" > /htdocs/html/Chrome/index.html
[root@server1 /]# echo "Welecom IE" > /htdocs/html/IE/index.html

测试

手机

blob.png

chrome

blob.png 
IE

blob.png

总结

这次主要简单介绍了一下Nginx作为Web服务器的简单使用方法,和针对不同用户代理进行跳转,过几天我还会写Nginx作为代理服务器的相关文章,敬请期待! 
作者:AnyISalIn QQ: 1449472454 
感谢:MageEdu

原创文章,作者:Net18-AnyISalIn,如若转载,请注明出处:http://www.178linux.com/14119

(1)
上一篇 2016-04-04 07:41
下一篇 2016-04-05 17:28

相关推荐

  • Linux 用户、用户组及权限管理

    一、Linux用户及用户组的基本概念 用户:用户是实现能够将有限的资源在多个使用者之间进行分配;、 用户组:用户组是指多个用户的集合,方便对一类需要同样权限的用户授权 Linux是多用户、多任务的操作系统。     多用户指:多人同时使用系统资源;多任务:同时运行多个进程 二、用户及用户组类别 1、用户:名称解析库 /…

    Linux干货 2016-03-20
  • 特殊权限

    特殊权限 文件特殊权限 一、SUID(4) SUID:当s这个标志出现在文件所有者的x权限上时,就被称作SUID。 SUID的功能和限制:1、仅仅对二进制程序有效; 2、执行者对程序需要X的执行权限; 3、本权限仅仅在执行该程序的过程中有效; 4、执行者将具有该程序所有者的权限。 5、SUID仅仅可以用在二进制程序上,…

    Linux干货 2016-08-05
  • 硬链接与软链接的联系与区别

    硬链接与软链接的联系与区别 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(ino…

    Linux干货 2016-10-23
  • 推荐-LINUX磁盘管理

    Evernote Export LINUX磁盘管理 linux学习笔记 磁盘分区 文件系统 挂载 在操作系统中,磁盘管理属于设备管理的范畴。一块硬盘安装到主机之后称为裸设备,若要能够在Linux系统中使用必须对其进行如下步骤:分区=>格式化(创建文件系统)=>挂载 LINUX系统的设备类型 Linux沿袭Unix的风格,将所有设备认成是一个文件 …

    Linux干货 2016-04-05
  • linux用户与用户组

    一.用户 用户是能够获取系统资源的权限的集合. 二.linux用户组的分类: a.管理员root  :具有使用系统所有权限的用户,其UID为0. b.Centos 6普通用户:即一般用户,其使用系统的权限受限,其UID为500-60000之间Centos7UID为1000-60000之间。 c.Centos 6系统用户:保障系统运行的用户,一般不提…

    Linux干货 2016-10-24
  • Linux的用户组和权限管理之特殊权限及ACL的使用

    用户组和权限管理 一、了解和使用批量新建用户和批量修改用户密码: ##用户创建的模板和配置文件的存放位置:/etc/default/useradd;/etc/skel/* ;/etc/login.defs## 批量新建用户(newusers):适合用于新老机器转换时,迁移系统上的用户。 使用格式: newusers  passwd  fi…

    Linux干货 2016-08-04