HTTP 基本认证中,web 服务器拒绝一个事务,质询客户端,请用户提供有效的用户名和密码。同时,返回 401 状态码,并用 WWW-Authenticate 响应首部指定要访问的安全域(realm)。然后,客户端用 Authorization 请求首部发送经过 base64 加密之后的用户名密码(用户名:密码)给服务器。

Nginx 搭建 HTTP Basic Authorization

Nginx ngx_http_auth_basic_module 可以实现 HTTP Basic Authorization 协议。

location / {
    auth_basic 'authorization';
    auth_basic_user_file conf/htpasswd;
}
  • auth_basic: string | off,默认 off,不开启。开启 HTTP Basic Authorization 只需要填写一个字符串,该字符串会作为 realm 的值,在服务器质询客户端的返回头部信息 WWW-Authenticate 中显示,如:WWW-Authenticate: Basic realm="Authorication"

  • auth_basic_user_file: 指定访问的用户名和密码的配置文件,如,htpasswd

    # comment
    name1:password1
    name2:password2:comment
    
    • 可以用 # 注释
    • 可以设置多个用户名和密码,每行一个,用户名和密码之间用 : 隔开,注释也可以写在密码后面,用 : 隔开。
    • 用户名直接填写,但是密码需要经过加密。如,Linux 系统,密码 123456 可以用 openssl passwd 123456 生成。

假设,刚刚搭建的服务器地址为:127.0.0.1。从浏览器访问 http://127.0.0.1 就会收到一个 401 质询,弹出一个用户名和密码的输入框。用户输入账号和密码之后,浏览器会用 : 将其连接起来,编成 base64 编码,然后将其放在请求头部的 Authorization 中发送给服务端。服务端验证通过后就可以正常浏览页面的内容了。

HTTP 基础认证过程

假如,nginx 配置好的认证页面为 http://127.0.0.1

  • telnet 建立一条 http 连接
telnet 127.0.0.1 80
  • 发送正常的请求,会返回 401
HEAD / HTTP/1.1
Host: 172.16.105.114

HTTP/1.1 401 Unauthorized
Server: BDSCAN/1.5.0
Date: Wed, 17 Jan 2018 08:26:04 GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="authorization"
  • 发送带验证信息的请求
HEAD / HTTP/1.1
Host: 172.16.105.114
Authorization: Basic bGl6czoxMjM0NTY=

HTTP/1.1 200 OK
Server: BDSCAN/1.5.0
Date: Wed, 17 Jan 2018 08:26:59 GMT
Content-Type: text/html
Content-Length: 334
Last-Modified: Tue, 16 Jan 2018 08:55:10 GMT
Connection: keep-alive
ETag: "5a5dbdee-14e"
Accept-Ranges: bytes

验证信息放在请求头的 Authorization,即 Authorization: Basic base64-username-and-passwordbase64-username-and-password 为用户名和密码用 : 连接起来,并经过 base64 编码等到的字符串 (即上面的 bGl6czoxMjM0NTY=) 。Python(python2) 生成:

import base64

username = 'lizs'
password = '123456'
msg = base64.b64encode('%s:%s' % (username, password))

PHP5.6

CentOS 默认的 yum 源安装的 PHP 版本过低,又想通过 yum 来安装 PHP5.6。

  • 查看系统上是否安装了 PHP,有就删除。
    查看系统是否安装了 PHP
    yum list installed | grep php
    # 删除PHP相关的模块
    yum remove phpxxx
    
  • 添加 EPEL 和 REMI 源
    rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    
  • 查看 yum 源是否有 PHP5.6 及相关库
    yum list --enablerepo=remi --enablerepo=remi-php56 | grep php
    
  • 添加 REMI 源成功之后,安装 PHP5.6 及相关库
    yum install --enablerepo=remi --enablerepo=remi-php56 php-fpm php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd
    

Nginx

  • 添加 nginx 的 yum 源
    wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
    

    或者直接添加 /etc/yum.repos.d/nginx.repo

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/6/$basearch/
    gpgcheck=0
    enabled=1
    
  • 安装 nginx
    yum install -y nginx
    

MySQL

  • 删除系统中旧版本的MySQL
    # 检测到系统中有 mysql-libs-5.1.73-3.el6_5.x86_64
    rpm -qa | grep mysql   
    # 删除旧版本MySQL包和相关的依赖
    rpm -e --nodeps mysql-libs-5.1.73-3.el6_5.x86_64
    
  • 添加 MySQL 的 yum 源。
    到 https://dev.mysql.com/downloads/repo/yum/ 下载相应的 RPM 包,如:mysql57-community-release-el6-11.noarch.rpm

    wget https://repo.mysql.com//mysql57-community-release-el6-11.noarch.rpm
    rpm -Uvh mysql57-community-release-el6-11.noarch.rpm
    
  • 安装 MySQL
    yum install mysql-community-server
    

    更多信息可以参考:A Quick Guide to Using the MySQL Yum Repository

MariaDB

  • 添加 yum 源
    Setting up MariaDB Repositories 生成相应 的 yum 源,然后添加到 /etc/yum.repos.d/mariadb.repo

    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.2/centos6-amd64
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1
    
  • 安装 MariaDB
    yum install -y MariaDB-server MariaDB-client MariaDB-devel
    

用官方源下载在没有翻墙的情况下是很慢的,可以用中国科学技术大学的镜像,不过也很不稳定。

size

A value without a suffix means bytes.

  • k/K: kilobytes (kb)

  • m/M: megabytes (mb)

time

A value without a suffix means seconds.

  • ms: milliseconds

  • s: seconds

  • h: hours

  • d: days

  • w: weeks

  • M: months, 30 days

  • y: years, 365days

Multiple units can be combined in a single value with whitespace. e.g. “1h 30m”.


nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
  • -?, -h:显示 Nginx 帮助文档

  • -v:显示 Nginx 版本

  • -V:显示 Nginx 版本、编译器版本和 Nginx 配置参数。

  • -t:测试 Nginx 配置

  • -T:测试 Nginx 配置,同时将显示配置文件内容。

  • -q:在测试 Nginx 配置时,不显示非错误信息。i.e. 如果配置正确,nginx -qt 将不输出任何信息。

  • -s signal,发送一个信号给 Nginx 主进程,signal 有如下几种值:

    • stop:快速停止 Nginx,可能不保存相关信息

    • reload:重新加载 Nginx 配置

    • quit:完整有序地停止 Nginx,并保存相关信息

    • reopen:重新打开日志文件

注意:使用这些信号命令,需要 Nginx 进程的 PID。所以,Nginx 的配置文件中 pid xx.pid 不能够注释掉。

  • -p prefix:指定 Nginx 启动时的工作目录,这个命令可以重新配置 Nginx 目录。prefix, usr/shar/nginx

  • -c file:指定 Nginx 启动配置文件路径,如:/etc/nginx/nginx.conf

windows 下启动 Nginx 命令:start nginx

Nginx 是一个自由、开源、高性能及轻量级的 HTTP 服务器及反向代理服务器。其性能与 IMAP/POP3 代理服务器相当。Ningx 以其高性能、稳定、功能丰富、配置简单及占用系统资源少而著称。Nginx 拥有超越 Apache 的高性能和稳定性。

  • 基础功能(HTTP)
    • 处理静态文件,,索引文件以及自动索引
    • 反向代理加速(无缓存),简单的负载均衡和容错
    • FastCGI,简单的负载均衡和容错
    • 模块化的结构。过滤器包括 gzipping, byte ranges, chunked responses,以及 SSI-filter。 在 SSI 过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理
    • SSL 和 TLS SNI 支持
  • Nginx 优势
    • Nginx 作为 Web 服务器:专为性能而开发,相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。有报告表明,Nginx 能够支持高达 50000 个并发连接数的响应。
    • Nginx 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器对外进行服务。
    • Nginx 作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
    • Nginx 具有很高的稳定性。其它 HTTP 服务器,当遇到访问高峰期,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如,当 Apache 一旦上到 200 个以上的进程,Web 响应速度就明显非常缓慢了。而 Nginx 采用了分阶段资源分配技术,使得它的 CPU 与内存占用率非常低。
    • Nginx 支持热部署。它的启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重启。你还能够在不间断服务的情况下,对软件版本进行升级。
    • Nginx 用 C 编写,无论是系统资源开销,还是 CPU 使用效率都比 Perlbal 要好很多。

需求

最近用微擎框架做微信公众号开发,需要通过绑定站点域名来收发信息。因此,平常在本地的开发环境是不能够满足需求的。但是,我们不可能每更改一点东西就将更改之后的内容更新到服务器上面去测试吧。为了能够让 URL 访问到本地的服务器,可以将指定域名的访问反向代理到本地来。

解决

  • 首先,分配子域名,并且指向你的远程服务器。比如,*.lizsblog.com

  • 在配置方向代理之前,必须在本地网络的路由给你的 PC 设置一个虚拟服务器(端口转发)。即,分配一个固定的 IP 和端口号,当访问你网络的 IP 和你分配的端口号时,路由就会将访问转发到你的 PC。光纤用户,要先配置光纤猫。

| 名称 | 协议 | 外部端口 | 内部 IP 地址 | 内部端口 |

|——–|———|—————|——————–|—————|

| lizs | TCP 和 UDP | 8112 | 192.168.1.99 | 80 |

  • 在远程服务器上面配置一个方向代理,指向你本地生产环境的服务器。

server { listen 80; server_name *.lizsblog.com; location / { proxy_redirect off; proxy_pass http://183.26.116.104:8112; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 20m; } }

proxy_pass 参数后面的 183.26.116.104 是你本地网络的 IP,可以通过百度搜索 ip 即可查看;8112 是你本地网络给你 PC 设置的虚拟服务器的端口号。

  • 通过从远程服务器中反向代理你本地的 PC 之后,只要配置本地 Nginx 服务器就可以了。

Nginx 一般都有一个 default 配置的,里面的 root 只要指向你的项目文件就可以了。比如,


root /home/lizs/app/we7/shengmingtrip

但是,这样存在一个问题,当你要用同样的方法做第二个项目的时候,你就要将 root 指向你的第二个项目文件目录了。那么,如果想要访问第一个项目呢?不是又要修改回来了吗?那如果有更多的项目呢?我们可以根据不同的域名来访问不同的项目文件:


# Default server configuration server { listen 80 default_server; listen [::]:80 default_server; set $dir_name default; # shengming project if ($host = "shengmingtrip.lizs.easecloud.cn") { set $dir_name we7/shengmingtrip; } # dsyd project if ($host = "dsyd.lizs.easecloud.cn") { set $dir_name we7/dsyd; } root /home/lizs/app/$dir_name; # Add index.php to the list if you are using PHP index index.html index.htm index.php index.nginx-debian.html; server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { include snippets/fastcgi-php.conf; # With php5-cgi alone: fastcgi_pass 127.0.0.1:9000; # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; } }

实践环境:ubuntu14.04

更新系统数据:


$ sudo apt-get update $ sudo apt-get upgrade

Nginx


$ sudo apt-get install nginx

成功安装之后,启动 Nginx 之后,访问localhost(127.0.0.1)会显示欢迎页面。

MySQL


$ sudo apt-get install mysql-server php5-mysql

如果需要,可以安装 phpmyadmin


$ sudo apt-get install phpmyadmin

PHP5

  • 安装 PHP5

$ sudo apt-get install php5-fpm

也可以同时安装其他 php5 库。


$ sudo apt-get install php5-fpm php5-cli php5-mysql php5-gd php5-mcrypt php5-curl

php5-cli:Command Line Interface,命令行界面。如果没有安装,你想要在终端执行 php 命令,或者执行一个 php 脚本文件(#!/usr/bin/php)等都是无法执行的。

php5-mysql:php5 的 mysql 数据库扩展,提供 php 能够访问 mysql 的接口。

php5-gd:gd 库是 php 处理图形的扩展库,gd 库提供了一系列用来处理图片的 API。

php5-mcrypt:php5 加密函数库

  • 配置 php5-fpm

更改配置文件 /etc/php5/fpm/php.inicgi.fix_pathinfo 的值为 0,然后,重启 php5-fpm 服务。

  • 配置 Nginx

配置 Nginx,是它支持 php 文件。

文件:/etc/nginx/sites-available/default


location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }

然后,重新载入 Nginx 配置:service nginx reload

PHP7

  • 添加 PPA(Personal Package Archives)

sudo apt-get install python-software-properties software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt-get update
  • 安装 php7.0

sudo apt-get install php7.0-fpm

也可同时安装 php7.0 的一些扩展


sudo apt-get install php7.0-fpm php7.0-mysql php7.0-cli php7.0-curl php7.0-mcrypt
  • 配置 php7.0-fpm

更改配置文件 /etc/php/7.0/fpm/php.inicgi.fix_pathinfo 的值为 0,然后,重启 php7-fpm 服务。

  • 配置 Nginx

location ~ \.php$ { fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; }