Nginx 的编译安装和URL地址重写
本文转自:http://www.178linux.com/14119#rd?sukey=ecafc0a7cc4a741b573a095a3eb78af6b4c9116b74d0bbc9844d8fc5e8b50b3fc807541ae53fd06c67ac4f4adaae6981
在此只是做个笔记给自己看的。
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 Tools和Server 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
测试页面访问正常


实现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
未导入证书前

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

实现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
分析日志查看相应用户代理的类型


针对用户代理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
测试
手机

chrome
 IE

转载请注明:linux运维部落 » Nginx专题: 从编译安装到URL重写
Nginx 的编译安装和URL地址重写的更多相关文章
- 初识Nginx及编译安装Nginx
		
初识Nginx及编译安装Nginx 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...
 - nginx的编译安装以及启动脚本编写
		
Nginx的编译安装和启动脚本的编写 Nginxd的功能强大,可以实现代理.负载均衡等企业常用的功能.下面介绍一下nginx的编译安装方法: 1. 下载 官方下载地址:http://nginx.org ...
 - 【01】Nginx:编译安装/动态添加模块
		
写在前面的话 说起 Nginx,别说运维,就是很多开发人员也很熟悉,毕竟如今已经 2019 年了,Apache 更多的要么成为了历史,要么成为了历史残留. 我们在提及 Nginx 的时候,一直在强调他 ...
 - nginx应用编译安装
		
nginx应用编译安装: 安装编译所需依赖包: # apt-get install make gcc g++ libcurl3-openssl-dev libfreetype6-dev libmcry ...
 - 【nginx运维基础(1)】Nginx的编译安装与使用
		
nginx的官方手册: http://nginx.org/en/docs/ 编译安装 下载地址: http://nginx.org/en/download.html # 为了支持rewrite功能,我 ...
 - Nginx服务编译安装、日志功能、状态模块及访问认证模式实操
		
系统环境 [root@web ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@web ~]# uname -a Linux d ...
 - Nginx的编译安装及选项
		
编译安装Nginx1.安装常见的工具和库(GCC.PCRE.zlib.OpenSSL) Nginx是一个由C语言编写的,所以需要一个编译工具如GNU的GCC[root@www ~]# yum inst ...
 - centos7 yum安装nginx和 编译安装tengine
		
说明 我这里给大家演示一下如何安装nginx,nginx我就不多介绍了,然后我再说一点就是,安装的两种方法都可以,编译安装和yum安装,我不能每个都演示两遍呀,所以看到我这博客的你,学会举一反三好吧? ...
 - nginx重新编译安装upload模块
		
由于php处理上传会出现超时,并且显示上传进度官方php不支持nginx+php,所以决定让nginx自己处理上传,我本地环境是mac上已经安装过nginx1.8.0,安装方式为brew,所以需要重新 ...
 
随机推荐
- Android View和ViewGroup
			
View和ViewGroup Android的UI界面都是由View和ViewGroup及其派生类组合而成的. 其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也 ...
 - Socket用法详解
			
在客户/服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,也会创建与客户端连接的Socket. Scoket可以看作两端通信的收发器,服务端和客户端都通过 ...
 - luogu1097统计数字[noip2007提高组Day1T1]
			
题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...
 - javascript删除元素节点
			
1.删除元素父节点 function removeElement(_element){ var _parentElement = _element.parentNode; if(_parentElem ...
 - Java中正则Matcher类的matches()、lookAt()和find()的区别
			
在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回 ...
 - AccessHelper  需修改
			
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
 - 点透 & 解决方案
			
点透 & 解决方案 学习map: 现象:再现现象,总结导致点透出现的情况 分析原因 解决办法 现象 再现点透现象请使用一下方式: 手机访问传送门 复制链接到连图生成二维码后扫一扫 或者打开ch ...
 - nginx应用总结(1)--基础认识和应用配置
			
在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...
 - 常见HTTP状态基本解释
			
本文摘自互联网,但是忘记了具体网址,请见谅 在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Go ...
 - js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval
			
需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...