一、Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
二、搭建简单的Nginx环境
搭建环境: Linux CentOS7
Nginx不支持yum安装,需要用到包:nginx-1.10.3.tar.gz [下载地址:http://nginx.org/en/download.html]
依赖包: make gcc pcre-devel openssl-devel
0.要做的事
在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能:
- 支持SSL加密功能
- 设置Nginx账户及组名称均为nginx
- Nginx服务器升级到更高版本。
然后本机访问页面验证Nginx Web服务器:
1.准备一台虚拟机
在虚拟软件(KVM/VMwave)上安装一台Linux虚拟机,配置好虚拟网卡,设置ipv4地址,子网掩码(192.168.4.5/24)
2.安装Nginx软件包
- [root@proxy ~]# yum -y install gcc pcre-devel openssl-devel //安装依赖包
- [root@proxy ~]# useradd -s /sbin/nologin nginx //添加一个专用用户,关于为何s
- [root@proxy ~]# tar -xf nginx-1.10.3.tar.gz
- [root@proxy ~]# cd nginx-1.10.3
- [root@proxy nginx-1.10.3]# ./configure \
- > --prefix=/usr/local/nginx \ //指定安装路径
- > --user=nginx \ //指定用户
- > --group=nginx \ //指定组
- > --with-http_ssl_module //开启SSL加密功能
- [root@proxy nginx-1.10.3]# make && make install //编译并安装
ls /usr/local/nginx/sbin/nginx //查看是否有这个目录 有则安装成功
补充(关于为何添加专用用户):
按照最小特权原则,需要给Apache分配一个合适的权限,让其能够完成Web服务。
最小特权原则是系统安全中最基本的原则之一,它限制了使用者对系统及数据进行存取所需要的最小权限,既保证了用户能够完成所操作的任务,同时也确保非法用户或异常操作所造成的损失最小。必须保证Apache使用一个专门的用户和用户组,不要使用系统预定义的账号。
因为只有root用户可以运行Apache,DocumentRoot应该能够被管理Web站点内容的用户访问和使用Apache服务器的Apache用户和Apache用户组访问。所以,如果希望“cao”用户在Web站点发布内容,并且可以以httpd身份运行Apache服务器,通常可以将这个用户添加到apache组里.
总言之,我们以root用户启用Apache,以apache用户或组身份使用apache,因为如果不将root与apache用户分离,如果使用者具备root权限,他就可以通过Apache软件的系统路径向上找到根,这是很危险的.
3.启动Nginx
- [root@proxy ~]# /usr/local/nginx/sbin/nginx //启动服务
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop //关闭服务
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -V //查看软件信息
- [root@proxy ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/ //创建软链接,方便后期使用,输入nginx即可
4.验证Nginx正在运行
netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
nginx服务默认通过TCP 80端口监听客户端请求,观察通过TCP 80是否在被nginx占用,如果你的服务器还有其他的使用80端口的服务,如httpd,你就要关闭httpd,关闭进程 kill all -9 httpd
- [root@proxy ~]# /usr/local/nginx/sbin/nginx //启动nginx
- [root@proxy ~]# netstat -anptu | grep nginx // 观察端口信息
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10441/nginx
- [root@proxy ~]# firefox localhost //用火狐启动,看到首页即为成功
三、用户认证
如果限制客户机访问Nginx,可以在Nginx服务器上添加几个用户,当客户机访问的时候,通过输入用户名和密码访问Web网站内容.
通过Nginx实现Web页面的认证,需要修改Nginx配置文件,在配置文件中添加auth语句实现用户认证。最后使用htpasswd命令创建用户及密码即可。
1.修改Nginx配置文件
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server { //打开配置文件后找到Server这一行,添加两条配置文件即可
- listen 80;
- server_name localhost;
- auth_basic "Input Password:"; //认证提示符信息
- auth_basic_user_file "/usr/local/nginx/pass"; //认证的密码文件
- location / {
- root html;
- index index.html index.htm;
- }
- }
2.生成密码文件,创建用户及密码
- [root@proxy ~]# yum -y install httpd-tools //需要安装这个功tool工具,否则无法执行htpasswd命令
- [root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom //创建密码文件 -c 创建pass文件 tom为用户名
- New password: //输入密码
- Re-type new password:
- Adding password for user tom
- [root@proxy ~]# htpasswd /usr/local/nginx/pass jerry //追加用户,不使用-c选项,只要第一次创建pass之后都不需要-c选项
- New password:
- Re-type new password:
- Adding password for user jerry
3.重新加载Nginx
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载配置文件
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory
4.测试
出现这个页面就代表成功了
四、配置Nginx虚拟主机
虚拟主机:
虚拟主机(英语:virtual hosting)或称 共享主机(shared web hosting),又称虚拟服务器,是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。虚拟主机之间完全独立,并可由用户自行管理,虚拟并非指不存在,而是指空间是由实体的服务器延伸而来,其硬件系统可以是基于服务器群,或者单个服务器。
其技术是互联网服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于HTTP,FTP,EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。如果划分是系统级别的,则称为虚拟服务器。
费用低廉:
相对于购买独立服务器,网站建设的费用大大降低,为普及中小型网站提供了极大便利。
虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台独立的主机完全一样。由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。
许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,网站服务器管理简单,诸如软件配置、防病毒、防攻击等安全措施都由专业服务商提供,大大简化了服务器管理的复杂性;同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。
案例:
- 实现两个基于域名的虚拟主机,域名分别为www.a.com和www.b.com
- 对域名为www.a.com的站点进行用户认证,用户名称为tom,密码为123456
修改Nginx配置文件,添加server容器实现虚拟主机功能;对于需要进行用户认证的虚拟主机添加auth认证语句。
虚拟主机一般可用分为:基于域名、基于IP和基于端口的虚拟主机。在这里使用基于域名的虚拟主机.
1.修改配置文件
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server {
- listen 80; //端口
- server_name www.a.com; //域名
- auth_basic "Input Password:"; //认证提示符
- auth_basic_user_file "/usr/local/nginx/pass"; //认证密码文件
- location / {
- root html; //指定网站根路径
- index index.html index.htm;
- }
-
- }
- … …
- server { //可以复制上一个配置文件的内容,做一些修改
- listen 80; //端口
- server_name www.b.com; //域名
- location / {
- root www; //指定网站根路径
- index index.html index.htm;
- }
- }
2.创建网站根目录及对应首页文件
- [root@proxy ~]# mkdir /usr/local/nginx/www //为www.b.com创建首页文件,www.a.com采用默认首页
- [root@proxy ~]# echo "This is www.b.com." > /usr/local/nginx/www/index.html
3.重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
4.添加一个本地域名解析信息
- [root@client ~]# vim /etc/hosts
- 192.168.4.5 www.a.com www.b.com
5.测试
可以访问到主页即为测试成功
- [root@client ~]# firefox www.a.com
- [root@client ~]# firefox www.b.com
6.扩展
基于端口和域名的配置:
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- server {
- listen 8080; //端口
- server_name www.a.com; //域名
- ......
- }
- [root@proxy ~]# vim www.a.com:8080 //域名加端口访问
基于端口和域名的配置:
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- server {
- listen 8080; //端口
- server_name 192.168.4.5; //域名
- ......
- }
- [root@proxy ~]# vim 192.168.4.5:8080 //ip加端口访问
五、SSL虚拟主机
SSL(Secure Socket Layer),为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上的传输过程中不会被截取及窃听。一般通用的规格为40 bit的安全标准,美国则已推出128 bit的更高安全标准,但限制出境。只要3.0版本以上的I.E.或Netscape浏览器即可支持SSL。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
通俗来讲,不使用SSL协议就不安全,如果简单的进行文件传输,当访问者输入账号密码给服务器后一切都是明文显示的,如果这时候有人抓包就可以看到文件的内容,使用SSL协议将数据加密,即使被抓包了也看不到文件的具体内容,极大提高的了安全性,尤其是涉及金钱交易的网站.
案例:
- 域名为www.c.com
- 该站点通过https访问
- 通过私钥、证书对该站点所有数据加密
Nginx上的SSL协议:
源码安装Nginx时必须使用--with-http_ssl_module参数(上文安装Nginx有提及),启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
加密算法:
加密算法一般分为对称算法、非对称算法、信息摘要。
对称算法有:AES、DES,主要应用在单机数据加密。
非对称算法有:RSA、DSA,主要应用在网络数据加密。
信息摘要:MD5、sha256,主要应用在数据完整性校验。
1.生成私钥与证书
- [root@proxy ~]# cd /usr/local/nginx/conf
- [root@proxy ~]# openssl genrsa > cert.key //生成私钥,文件名必须与配置文件内相同
- [root@proxy ~]# openssl req -new -x509 -key cert.key > cert.pem //生成证书
2.修改Nginx配置文件
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf //此文件下有下面的内容,默认是被注释掉了,去掉注释即可使用
- … …
- server {
- listen 443 ssl;
- server_name www.c.com; //修改一下域名
- 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;
- }
- }
3.重新加载配置
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
4.添加域名解析
- [root@client ~]# vim /etc/hosts
- 192.168.4.5 www.c.com
5.测试
- [root@client ~]# firefox https://www.c.com //信任证书后可以访问
如果出现下面内容代表添加成功,点击Advanced,将此网址添加到信任列表,因为我们配置是本地SSL认证,而不是第三方认证,没有权威性,所以浏览器会弹出这样的提示