马哥教育网络20期—nginx

Nginx

一. Nginx 特性
二. Nginx 基本架构
三. Nginx 基本功能
四. Nginx 安装
五. Nginx 配置文件
六. Nginx http服务功能测试
七. Nginx LNMP

一. Nginx 特性

  • 模块化,目前只能将模块编译进Nginx,暂时不支持动态装卸载模块.(httpd优势)

  • 可靠性,一个主进程(master)控制多个工作进程(worker),工作进程响应用户多个请求(httpd劣势)

  • 低内存消耗,(httpd劣势)

  • 支持热部署,(httpd一样)

  • 支持事件驱动I/O,AI/O,支持mmap(httpd2.4才算支持event,劣势)

二. Nginx 基本架构

Nginx由一个master进程生成多个worker进程,每个worker进程接收用户请求,支持sendfile,AIO,mmap,

43.png

三. Nginx 基本功能

  • 静态资源WEB服务器,能缓存打开的文件描述符

  • http,反向代理服务器,缓存服务器,负载均衡服务器

  • 支持fastcgi(php),uwsgi(python)与动态程序结合

  • 支持ssl传输

  • 支持虚拟主机

  • 支持keepalive

  • 支持平滑升级

  • 支持定制日志,日志缓存

  • 支持url重写

  • 支持路径别名

  • 支持限速,并发控制

  • look look www.nginx.org

四. Nginx 安装

~]# yum install pcre-devel openssl-devel -y
~]# groupadd -r nginx
~]# useradd -r -g nginx -s /sbin/nologin -M nginx
~]# cd /usr/src/
src]# tar xf nginx-1.8.1.tar.gz
src]# cd nginx-1.8.1
nginx-1.8.1]# ./configure --prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--user=nginx --group=nginx \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_mp4_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
nginx-1.8.1]# make && make install
nginx-1.8.1]# mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi}
nginx-1.8.1]# cd /usr/local/nginx
nginx]# ll  #才两个目录,当然,我们的配置文件和log文件存放在其他目录,可见nginx多轻量级
total 8
drwxr-xr-x 2 root root 4096 Jun 24 23:34 html
drwxr-xr-x 2 root root 4096 Jun 24 23:34 sbin
nginx]# cd ~
~]# echo "export PATH=/usr/local/nginx/sbin:$PATH" > /etc/profile.d/nginx.sh    #准备nginx程序执行是的环境变量
~]# mkdir .vim
~]# cp -ra /usr/src/nginx-1.8.1/contrib/vim/* .vim/     #设置nginx配置文件的语法着色,
~]# . /etc/profile.d/nginx.sh
~]# nginx   #启动nginx

五. nginx配置文件

~]# cd /etc/nginx/
[root@node2 nginx]# ll
total 60
-rw-r--r-- 1 root root 1034 Jun 24 07:21 fastcgi.conf           #FPM配置文件段
-rw-r--r-- 1 root root 1034 Jun 24 07:21 fastcgi.conf.default
-rw-r--r-- 1 root root  964 Jun 24 07:21 fastcgi_params
-rw-r--r-- 1 root root  964 Jun 24 07:21 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Jun 24 07:21 koi-utf
-rw-r--r-- 1 root root 2223 Jun 24 07:21 koi-win
-rw-r--r-- 1 root root 3957 Jun 24 07:21 mime.types             #mime类型配置文件
-rw-r--r-- 1 root root 3957 Jun 24 07:21 mime.types.default
-rw-r--r-- 1 root root 2656 Jun 24 07:21 nginx.conf             #nginx主配置文件
-rw-r--r-- 1 root root 2656 Jun 24 07:21 nginx.conf.default
-rw-r--r-- 1 root root  596 Jun 24 07:21 scgi_params
-rw-r--r-- 1 root root  596 Jun 24 07:21 scgi_params.default
-rw-r--r-- 1 root root  623 Jun 24 07:21 uwsgi_params           #uwsgi配置文件段
-rw-r--r-- 1 root root  623 Jun 24 07:21 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Jun 24 07:21 win-utf
nginx的配置文件主要分为两段:main http
main主要是控制nginx程序的运行
http主要是操作web服务器,且http配置段下还可以继续分为server段(虚拟主机)
配置文件分段即可把分段的配置文件从主文件剥离出来,形成单独的配置文件,并且只要在主配置文件中include此配置文件即可,比如说server虚拟主机配置文件段
================================
主配置段:
user  nginx nginx;      #worker进程运行的属主与属组
worker_processes  3;    #worker进程数,建议与CPU核心数少1
pid        /var/run/nginx/nginx.pid;    #指定pid文件位置
worker_rlimit_nofile 50000;             #显示所有worker进程所能打开的文件数目
worker_cpu_affinity 0001 0010 0100;     #绑定CPU,八核cpu就8个0,
events {
    worker_connections  10240;          #每个worker进程所能并发处理的连接数
}

http配置段:
include       mime.types;       #包含mime配置文件所有配置内容
sendfile        on;             #开启sendfile功能
keepalive_timeout  65;          #开启长连接

server配置段:
listen       80;                #监听端口
server_name  localhost;         #服务器名字
location{}                      #针对匹配到不同的url可以下发不同的配置段
gzip  on;                       #开启gzip压缩

六. Nginx http服务功能测试

  1. root path

  2. location [ = | ~ | ~* | ^~ ] uri { … }

  3. alias path

  4. error_page

  5. ssl

  6. stu_status内置状态页面

  7. url重写

  8. if语法

  9. 定制日志

root path
root是指定网页文件存放的路径,可以在server配置段,也可以在location配置段,
存在location配置段时:
    绝对路径:优先级最高  
    root /vhosts/web/;
    location / {
        root   /vhosts/web1;            #访问的是/vhosts/web1/index.html
        index  index.html index.htm;
    }
    相对路径:是相对于nginx安装路径目录下html
    root /vhosts/web/;
    location / {
        root   html;                    #相对路径,访问的是/usr/local/nginx/html/index.html,
        index  index.html index.htm;
    }
存在server配置段时:location建议不要配置.
    root /vhosts/web/;                  #此时才是访问/vhosts/web/index.html
    location / {
        index  index.html index.htm;    
    }
location [ = | ~ | ~* | ^~ ] uri { … }
符号表示匹配后面uri的优先级,[=] > [^~] > [~|~*] >不带任何修饰符,其中[~]表示区分大小写,[~*]表示不区分大小写
测试图片,图片本身就标注了存放位置:

46.png

测试目录:
[root@node2 vhosts]# tree
.
├── a.png
├── web1
│   ├── documents
│   │   └── a.png
│   └── images
│       └── a.png
├── web2
│   ├── documents
│   │   └── a.png
│   └── images
│       └── a.png
└── web3
    ├── documents
    │   └── a.png
    └── images
        └── a.png
测试配置:
location /documents/ {
    root /vhosts/web1;
    index  index.html index.htm;
}
location ^~ /images/ {
    root /vhosts/web2;
    index  index.html index.htm;
}
location ~* \.(png|jpg|jpeg)$ {
    root /vhosts/web3;
    index  index.html index.htm;
}
location = /a.png {
    root /vhosts;
    index  index.html index.htm;
}
测试结果:
当我们访问:192.168.3.20/images/a.png
说明:根据我们的URL[/images/a.png],服务器匹配location事先定义好的url,可以匹配到第二个与第三个location,因为[^~] > [~*],所在才有看到的是/vhosts/web2/images/a.png

44.png

当我们访问:192.168.3.20/documents/a.png
说明:根据我们的URL[/documents/a.png],服务器匹配location事先定义好的url,可以匹配到第一个与第三个location,因为[~|~*] >不带任何修饰符,所以才看到的是/vhosts/web3/documents/a.png

45.png

[=]的匹配也可以参考如上说明,
结论:匹配方式是根据用户输入的URL部分去匹配我们定义的location,当URL可以匹配到多个location的时候,就有了优先级的定义,

优先级:[=] > [^~] > [~|~] >不带任何修饰符*

alias path
访问资源是的URL与实际资源存储位置不一样,就需要别名定义实际存储位置,
location /documents/ {
    alias /vhosts/web1/;
    index  index.html index.htm;
}
当我们访问192.168.3.20/documents/时,显示的却是:

47.png

error_page
根据http响应状态码来指明特定的错误页面
location / {
    root /vhosts/web1/;
    index  index.html index.htm;
}
error_page  404     /404.html;      #当访问不存在的资源时,就会回应404错误代码,根据404错误代码会显示特定的404.html,这个页面是存在与/vhosts/web1/目录下

48.png

ssl
编译时需要选择此模块 --with-http_ssl_module(httpd程序是需要安装mod_ssl模块,并且配置是在ssl配置文件中配置)
CA服务器生成私钥,自己对自己签名
CA]# touch index.txt
CA]# echo 01 > serial
CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048;)
CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3560   
客户端服务器生成私钥,并且生成证书申请请求
~]# mkdir /usr/local/nginx/ssl
~]# cd /usr/local/nginx/ssl
ssl]# openssl genrsa -out node2.key 1024
ssl]# openssl req -new -key node2.key -out node2.csr -days 365
ssl]# scp node2.csr root@ns1:/tmp/node2.csr
CA服务器对客户端传送过来的证书请求签发
CA]# openssl ca -in /tmp/node2.csr -out ./certs/node2.stu.com.crt -days 365
CA]# scp certs/node2.stu.com.crt root@node2:/usr/local/nginx/ssl/
Nginx服务器配置支持ssl,我们在编译此nginx服务器时就包括了
server {
    listen       443 ssl;
    server_name  localhost;
    ssl_certificate      /usr/local/nginx/ssl/node2.stu.com.crt;    #从CA申请过来的证书
    ssl_certificate_key  /usr/local/nginx/ssl/node2.key;            #私钥
    ssl_session_cache    shared:SSL:1m;                             #ssl会话共享缓存,1分钟时间
    ssl_session_timeout  5m;                                        #ssl会话超时时间5分钟
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
    location / {
        root /vhosts/web1;
        index index.html index.htm;
    }
}

49.png

50.png

stu_status内置状态页面
在location中定义:
location /nginx-status {
    allow 192.168.3.0/24;       #基于IP地址访问控制
    deny all;
    stub_status on;             #开启状态页面
    access_log off;             #关闭状态页面的访问日志
}
测试访问:
[root@node3 nginx]# curl http://node2.stu.com/nginx-status
Active connections: 2 
server accepts handled requests
 235 235 1239 
Reading: 0 Writing: 1 Waiting: 1
=====解释如下=====
Active connections:当前所有处于打开状态的连接数
accepts:已经接收进来的连接
handled:已经处理过的连接
requests:已经处理过的请求数
Reading:正处于接收请求状态的连接数
Writing:请求已经接收完成,正处于处理请求或发送响应过程的连接数
Waiting:保持连接且处理于活动状态的连接数
url重写
将用户请求特定资源的URL路径修改重定向到其他路径,(break,last,redirect,permanent是可选参数)
location / {
    root /vhosts/web2;
    rewrite /documents/(.*\.png)$ /images/$1 break;     #将访问/vhosts/web2/documents/路径下以.png结尾的资源,全部重定向到/vhosts/web2/images/
    index  index.html index.htm;
}

51.png

break:一旦对此rewrute规则重写后,由user agent对新的url重新发起新的请求,且不会在被location内的rewrite规则检查,
last:一旦对此rewrute规则重写后,由user agent对新的url重新发起新的请求,如果还有被location内的rewrite匹配中那么就继续重写URL,这是多么痛的领悟,
location / {
    root /vhosts/web2;
    rewrite /documents/(.*\.png)$ /images/$1 last;      #采用last,重写后的URL会匹配到下面一条location规则,并且还会被在重写,
    index  index.html index.htm;
}
location ^~ /images/ {                                  #利用^~强行将URL的images抓到此location下进行URL重写
    root /vhosts/web1/;
    rewrite /images/(.*\.png)$ /documents/$1 break;     #用户输入node2.stu.com/documents/a.png最后其实访问的是/vhosts/web1/documents/a.png
    index  index.html index.htm;
}

52.png

redirect:以302状态响应码(临时重定向),返回新的URL,
location / {
    root /vhosts/web2;
    rewrite /documents/(.*\.png)$ /images/$1 redirect;
    index  index.html index.htm;
}

53.png

permanent:以301 #状态响应码(永久重定向),返回新的URL,
location / {
    root /vhosts/web2;
    rewrite /documents/(.*\.png)$ /images/$1 permanent;
    index  index.html index.htm;
}

54.png

if语法
if语句的语法:if(condition) {},应用位置:server,location配置段
condition:
1. 变量赋值:禁止变量赋值为空或者以"0"开头,其他都OK
2. 以变量为操作数构成的比较表达式,可使用=,!=类似操作符比较
3. 正则表达式的模式匹配操作
    ~:区分大小写
    ~*:不区分大小写
    !~和!~*对上面两种测试取反
4. 测试路径为文件的可能性:-f | !-f
5. 测试指定路径为目录的可能性:-d | !-d
6. 测试文件存在性:-e | !-e
7. 检查文件是否有执行权限:-x | !-x
location / {
    root /vhosts/web2;
    if ($http_user_agent ~* Chrome) {       #如果是谷歌浏览器就把URL重写到/vhosts/web2/images/index.html
        rewrite ^(.*)$ /images/$1 break;
    }
    index  index.html index.htm;
}

55.png

Embedded Variables
$http_user_agent
$http_cookie
$connection             #connection serial number (1.3.8, 1.2.5)
$connection_requests    #current number of requests made through a connection (1.3.8, 1.2.5) 
$content_length         #“Content-Length” request header field
$content_type           #“Content-Type” request header field 
$cookie_name            #the name cookie
$host                   #in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request 
$hostname               #host name 
$nginx_version          #nginx version 
$pid                    #PID of the worker process 
$remote_addr            #client address 
$remote_port            #client port 
$remote_user            #user name supplied with the Basic authentication 
$time_local             #local time in the Common Log Format (1.3.12, 1.2.7) 
$server_name            #name of the server which accepted a request 
$server_port            #port of the server which accepted a request 
$server_protocol        #request protocol, usually “HTTP/1.0”, “HTTP/1.1”, or “HTTP/2.0” 
look look www.nginx.org  http://nginx.org/en/docs/http/ngx_http_core_module.html
======防盗链=====
valid_referers none blocked server_names
           *.example.com example.* www.example.org/galleries/
           ~\.google\.;
    if ($invalid_referer) {     #invalid_referer表示该用户是从哪个位置链接过来本网站的
        return 403;
}
定制日志
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '       
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;    #上面定义的日志在此处调用,定义日志信息的变量都是内置变量

七.Nginx LNMP

PHP程序可以作为Apache的httpd模块运行,也可以通过FPM的方式与httpd联动.
而PHP程序与Nginx程序联动只能以FPM的方式.
准备Mariadb:
src]# tar xf mariadb-5.5.46-linux-x86_64.tar.gz
src]# ln -sv /usr/src/mariadb-5.5.46-linux-x86_64 /usr/local/mysql
src]# cd /usr/local/mysql
mysql]# groupadd -r mysql
mysql]# useradd -r -g mysql -s /sbin/nologin -M mysql
mysql]# chown -R mysql:mysql .
mysql]# mkdir -pv /mydata/data
mysql]# chown -R mysql:mysql /mydata/data
mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
mysql]# chown -R root .
mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
mysql]# chkconfig --add mysqld
mysql]# chkconfig mysqld on
mysql]# mkdir /etc/mysql
mysql]# cp support-files/my-large.cnf /etc/mysql/my.conf
mysql]# vi /etc/mysql/my.conf
    datadir=/mydata/data
mysql]# echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh     #还有include文件,库文件,man文件没有做链接.
mysql]# . /etc/profile.d/mysql.sh
mysql]# service mysqld restart                                      #遇到一个错误,PID file not found ,重启之后就可以了,用ps -aux | grep mysqld 都看不到任何mysqld的进程
MySQL server PID file could not be found!                  [FAILED]
Starting MySQL..                                           [FAILED]
mysql]# service mysqld start
Starting MySQL..                                           [  OK  ]
=====安装php=====
php-5.4.26]# cd /usr/src/php-5.4.26
php-5.4.26]# yum install pcre-devel openssl-devel libxml2-devel php-gd freetype-devel libjpeg-devel libpng-devel bzip2-devel libmcrypt-devel -y
php-5.4.26]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
php-5.4.26]# make -j 4 && make install
php-5.4.26]# cp php.ini-production /etc/php.ini
php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
php-5.4.26]# chmod +x /etc/rc.d/init.d/php-fpm
php-5.4.26]# chkconfig --add php-fpm
php-5.4.26]# chkconfig php-fpm on
php-5.4.26]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
php-5.4.26]# vi /usr/local/php/etc/php-fpm.conf
    pm.max_children = 50
    pm.start_servers = 5
    pm.min_spare_servers = 2                    #这个数值不能大于start_server,想想知道,不然php服务起不来
    pm.max_spare_servers = 8
    pid = /usr/local/php/var/run/php-fpm.pid 
php-5.4.26]# service php-fpm start
======配置nginx支持php=====
location ~ \.php$ {
    root           /vhosts/web4/;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /vhosts/web4$fastcgi_script_name;       #需要指定我们指定存放php程序网站的路径
    include        fastcgi_params;
}
上传phpmyadmin测试(怎么是这个鬼样子,原来是浏览器的缘故谷歌不会):

56.png

57.png

(虚拟主机部分实验忘记做了= =!)

OK,告一段落。

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

(0)
nice_neo_linuxnice_neo_linux
上一篇 2016-06-26
下一篇 2016-06-26

相关推荐

  • centos查看和修改文件权限

      查看权限在终端输入:  ls -l xxx.xxx (xxx.xxx是文件名)那么就会出现相类似的信息,主要都是这些:-rw-r–r–其中: 最前面那个 – 代表的是文件类型中间那三个 rw- 代表的是所有者(user)然后那三个 r– 代表的是组群(group)最后那三个 r–   …

    2017-11-26
  • MySQL常用命令

    本文大纲 MySQL命令             (0%) 交互式CLI工具     服务端命令 mysqld服务器程序 数据类型 DDL语句                 &n…

    Linux干货 2017-02-16
  • Linux 计划任务快速理解入门

    计划任务简单来说是一个我们规定的时间去执行我们需要的脚本、命令及需要Linux做的事情。 以前写过一个脚本,由于当时没有学过计划任务,所以写起来特别痛苦,该脚本的需求是每天晚上11:00 备份/etc目录 当时特别小白,于是这么写的: VimrebootScript ‘ #!/bin/bash whiletrue;do If [ -d/app/e…

    Linux干货 2017-05-15
  • TCP 的那些事儿(下)

    这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西。但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定。在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的…

    Linux干货 2016-08-15
  • Python基础语法习题

    1、~12为什么是-13?解1:12 二进制:0000 1100补码: 0000 1100按位取反 :1111 0011求这个原码,即负数求补码的逆过程:先减1,再取反 (符号位不变)-1 1111 0010取反 1111 1101 还原成十进制-13 2、10^9等于?10^-9等于?解:(1)10^910的二进制:0000 10109的二进制: 0000…

    Linux干货 2018-03-24
  • 第十二周作业

    1、请描述一次完整的http请求处理过程;     1)建立或处理连接:接收请求或拒绝请求;     2)接收请求:接收来自于网络的请求报文中对某资源的一次请求的过程;接收请求的方式通常是并发访问响应模型;     3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息,解析后的报文…

    2017-03-27