实现LNMP(不同主机)并实现加密压缩缓存等功能

Nginx:

Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及一个IMAP / POP3代理服务器。 NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名,在连接高并发的情况下,Nginx是Apache服务器不错的替代品。
Nginx是为解决C10K问题而编写的少数服务器之一。与传统服务器不同,NGINX不依赖于线程来处理请求。相反,它使用更加可扩展的事件驱动(异步)架构。这种架构在负载下使用小的但更重要的是可预测的内存量。即使您不希望处理数千个并发请求,您仍然可以从NGINX的高性能和小内存中获益。 NGINX在各个方向扩展:从最小的VPS一直到大型服务器集群。
Nginx拥有诸如Netflix,Hulu,Pinterest,CloudFlare,Airbnb,WordPress.com,GitHub,SoundCloud,Zynga,Eventbrite,Zappos,Media Temple,Heroku,RightScale,Engine Yard,MaxCDN等众多高知名度网站。

一、安装环境:

避免不必要的麻烦这里关掉防火墙与SELinux。
systemctl stop firewalld.service
systemctl disable firewalld.service
sed -ri.bak '/^SELINUX=/s/.*/SELINUX=disabled/' /etc/selinux/config //修改SELinux为disabled. 重启即可
centos7:nginx (ip:172.16.250.111) //实现Nginx代理
centos7:SR1 (ip :192.168.16.101) //后端web服务器1
centos7:SR2 (ip :192.168.16.102) //后端web服务器2
centos7:NFS (ip :192.168.16.103) //后端NFS文件共享机制 提供:WordPress
centos7:mariabd (ip :192.168.16.104) //后端数据库
为了更直观点,画张简易拓扑图:


二、设置后端各项服务。
1.对SR1与RS2设置,提供http服务。
[root@centos7 ~]#yum -y httpd php php-mysql nfs-utils //安装相应服务,nfs-utils用于挂载nfs用到,否则出错。
[root@centos7 ~]#systemctl start  httpd.service   //启动httpd服务
[root@centos7 ~]#systemctl enable  httpd.service //开机启动httpd服务
2.在mysqlf服务设置WordPress数据库,
[root@centos7 ~]#yum -y install mariadb-server  //安装mysql服务centos7为mariadb
[root@centos7 ~]#systemctl start  mariadb.service  //启用mysql服务
[root@centos7 ~]#systemctl enable  mariadb.service  //开机启动mys服务
[root@centos7 ~]#mysql_secure_installation  //进行mysql安全设置
[root@centos7 ~]#mysql -uroot -p123456 //以mysql的root身份登入。
MariaDB [(none)]> create database blogdb; //创建WordPress数据库
MariaDB [(none)]> grant all on blogdb.* to wpuser@'192.168.18.%' identified by '123456';  
//创建WordPress用户和密码
[root@centos7 ~]#mysql -uwpuser  -p123456 -h192.168.18.104 //对穿建用户测试,能进入就说明成功了。
3.对nfs服务器设置
[root@centos7 ~]#yum -y install nfs-server  nfs-utils  //安装nfs服务
[root@centos7 ~]#systemctl start  nfs-server.service   //启动nfs服务
[root@centos7 ~]#systemctl enable   nfs-server.service //开机启用nfs服务
[root@centos7 app]#ll   //获取WordPress两个版本并设置连接blog指向wordpress4.8
总用量 8
lrwxrwxrwx. 1 apache apache   12 8月  24 14:11 blog -> wordpress4.8
drwxr-xr-x. 5 apache apache 4096 8月  24 19:59 wordpress4.8
drwxr-xr-x. 5 root   root   4096 8月   4 15:54 wordpress4.8.1
设置链接:ls -srv /app/wordpress4.8 /app/blog
这里也可以放置一个版本到blog里,为什么要设个链接,就是防止升级或某种原因使当前版本不能访问可切换到上一版本。
同理对某些服务更新来讲也是一样
useradd -u 48  -r -s /sbin/nologin apache  //这里创建Apache账户,这是为了让RS1和RS2连接到这台服务是能以继续行使Apache的权限。
 chown -R apache.apache /app/blog/   //设置归属权限
[root@centos7 blog]#cp wp-config-sample.php  wp-config.php
[root@centos7 blog]#vim wp-config.php //直接对配置文件修改,可省略到时候页面的填写
/** WordPress数据库的名称 */
define('DB_NAME', 'blogdb');
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
/** MySQL数据库密码 */
define('DB_PASSWORD', '123456');
/** MySQL主机 */
define('DB_HOST', '192.168.18.104');
[root@centos7 ~]#vim /etc/exports  //编辑nfs配置文件
[root@centos7 ~]#cat /etc/exports
/app/blog 192.168.18.0/24(rw,all_squash,anonuid=48,anongid=48)
对192.168.18.这个网段可挂载,有读写全新,其他用户压榨权限,除 apache
[root@centos7 app]#exportfs -r  // 检查
[root@centos7 app]#exportfs -v  // 列出
/app/wordpress4.8
    192.168.18.0/24(rw,wdelay,root_squash,all_squash,no_subtree_check,anonuid=48,
anongid=48,sec=sys,rw,secure,root_squash,all_squash)
4.对RS1和RS2挂载nfs.
[root@centos7 ~]#vim /etc/fstab //写进配置文件。可以以后开机自动挂载。
[root@centos7 ~]#cat /etc/fstab
.....
192.168.18.103:/app/blog        /var/www/html/blog       nfs     defaults  0 0 //在最后添加这条记录
[root@centos7 ~]#mkdir /var/www/html/blog -pv //没有此目录创建此目录。
[root@centos7 ~]#mount -a //对/etc/fstab 新增内容挂载
[root@centos7 ~]#df -h   //产看是否挂载成功
文件系统                  容量  已用  可用 已用% 挂载点
......
192.168.18.103:/app/blog   50G   90M   50G    1% /var/www/html/blog  此时已经成功
RS2:同样的上述操作。
[root@centos7 ~]#ll /var/www/html/blog/ -d   //查看权限显示为Apache ,因为我们对NFS服务器上的blog进行了权限的设定。
drwxr-xr-x 5 apache apache 4096 8月  24 20:54 /var/www/html/blog/
[root@centos7 ~]#ll /var/www/html/blog/
.....
-rw-r--r--  1 apache apache   418 9月  25 2013 index.php
-rw-r--r--  1 apache apache 19935 1月   3 2017 license.txt
-rw-r--r--  1 apache apache  6956 7月  23 19:28 readme.html
-rw-r--r--  1 apache apache  5447 9月  28 2016 wp-activate.php
drwxr-xr-x  9 apache apache  4096 7月  23 19:28 wp-admin
-rw-r--r--  1 apache apache   364 12月 19 2015 wp-blog-header.php
-rw-r--r--  1 apache apache  1627 8月  29 2016 wp-comments-post.php
......

测试:




设置好后,测试,出现如上画面说明后端服务器已经设置好了

下面进行Nginx代理的设置(centos7:nginx)
1.设置代理:
[root@centos7 ~]#vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 192.168.18.101:80 weight=1 max_fails=2 fail_timeout=3;
        server 192.168.18.102:80 weight=1 max_fails=2 fail_timeout=3;
(ip_hash;)这里可开启源地址hash算法;
    }  //在http 中添加或视情况增删其余配置
//调用ngx_http_upstream_module模块
 1.upstream name { ... }
定义后端服务器组;引入一个新的上下文;只能用于http{}上下文中;
默认的调度方法是wrr;
2.server address [parameters];
定义服务器地址和相关的参数;
地址格式:
IP[:PORT]
HOSTNAME[:PORT]
unix:/PATH/TO/SOME_SOCK_FILE
参数:
weight=number //权重,默认为1;
max_fails=number //失败尝试的最大次数;
fail_timeout=time //设置服务器为不可用状态的超时时长;
backup//把服务器标记为“备用”状态; 
down//手动标记其为不可用;
还可以定义:least_conn; //最少连接调度算法; 当server拥有不同的权重时为wlc;当所有后端主机的连接数相同时,则使用wrr进行调度;
ip_hash; //源地址hash算法;能够将来自同一个源IP地址的请求始终发往同一个upstream server;
2.设置主机代理配置
[root@centos7 conf.d]#cat vhost1.conf   //在/etc/nginx/conf.d/目录下创建虚拟主机,主配置文件同样会识别配置。
server {
    listen 80;  //监听端口
    server_name www.jie0112.com;  //主机名
    location / {    //uri匹配
    root "/data/nginx/vhost1";   //路径
    proxy_pass http://websrvs;  //代理后端服务器组名,与Nginx.conf主配置文件里http下,  upstream websrvs;一致
    }
}
[root@centos7 conf.d]#nginx -t  //检查配置文件是否有语法错误
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos7 conf.d]#nginx -s reload  //配置文件平滑加载,不需要重启Nginx服务

测试:
在测试机上设置解析

[root@centos7 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.18.131  www.jie0112.com
172.16.250.111 www.jie0112.com

此时已成功实现nginx代理

3.实现https加密。
1.创建私有CA。
[root@centos7 CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096) //创建私钥
[root@centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365  //生成公钥
自行填写相关信息
[root@centos7 CA]#touch index.txt //生成索引文件 必须建立
[root@centos7 CA]#echo 01 > serial  //生成证书序列文件 必须建立
[root@centos7 nginx]#mkdir ssl //创建文件夹,将放置Nginx的申请的证书文件,及公钥与私钥。
[root@centos7 ssl]#(umask 077;openssl genrsa -out nginx.key 2048)  //nginx的私钥
[root@centos7 ssl]#openssl req -new -key nginx.key -out nginx.csr //Nginx的公钥
[root@centos7 ssl]# openssl ca -in nginx.csr -out nginx.crt -days 365 //向CA申请证书
  注意:默认国家,省,公司名称三项必须和CA一致
[root@centos7 nginx]#cat conf.d/vhost1.conf 
server {
    listen 80;
    server_name www.jie0112.com;
     rewrite /blog/(.*)$   https://www.jie0112.com/blog/$1 ; //临时重定向。
    location / { 
    root "/data/nginx/vhost1";
    proxy_pass http://websrvs;
    }
}
[root@centos7 nginx]# cat conf.d/vhost1.ssl.conf 
[root@centos7 nginx]#cat conf.d/vhost1.ssl.conf  //配置重定向的虚拟主机。
server {
    listen 443 ssl;    //使用 443 端口 ssl 协议
    server_name www.jie0112.com;
    location / { 
    root "/data/nginx/vhost1";
    proxy_pass http://websrvs;
    }
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 600s;

}
//ssl_certificate file;当前虚拟主机使用PEM格式的证书文件;
//ssl_certificate_key file;当前虚拟主机上与其证书匹配的私钥文件
//ssl_session_cache off | none | [builtin[:size]] [shared:name:size];   builtin[:size]:
使用OpenSSL内建的缓存,此缓存为每worker进程私有;
//ssl_session_timeout time;客户端一侧的连接可以复用ssl session cache中缓存 的ssl参数的有效时长;
如需使用其他功能,参考ngx_http_ssl_module模块:
[root@centos7 conf.d]#nginx -t  //检查配置文件是否有语法错误
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos7 conf.d]#nginx -s reload  //配置文件平滑加载

测试:

此时为302临时重定向,证书如下所示


如果想要永久重定向则在/etc/nginx/conf.d/vhost1.conf里修改成如下配置。

[root@centos7 nginx]#cat conf.d/vhost1.conf 
server {
    listen 80;
    server_name www.jie0112.com;
     rewrite /blog/(.*)$   https://www.jie0112.com/blog/$1 permanent; //永久重定向
    location / { 
    root "/data/nginx/vhost1";
    proxy_pass http://websrvs;
    }
}
[root@centos7 conf.d]#nginx -t  //检查配置文件是否有语法错误
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos7 conf.d]#nginx -s reload  //配置文件平滑加载

测试:

此时为301永久重定向

3.增加Nginx的压缩模块。
[root@centos7 nginx]#cat conf.d/zip.conf   //新增zip配置文件
gzip  on;    //开启压缩
gzip_comp_level 6;    //等级为6
gzip_min_length 64; //启用压缩功能的响应报文大小阈值;
gzip_proxied any;  //任何都压缩
gzip_types text/xml text/css  application/javascript; // 压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能
[root@centos7 conf.d]#nginx -t 
[root@centos7 conf.d]#nginx -s reload

如下则开启了zip压缩功能
4,增加Nginx的缓存模块
[root@centos7 nginx]#cat conf.d/vhost1.ssl.conf  //vhost1.ssl.conf配置文件修改如下,因为已永久重定向就不必在vhost1.conf设置
server {
    listen 443 ssl;
    server_name www.jie0112.com;
    location / { 
    root "/data/nginx/vhost1";
    proxy_pass http://websrvs;
    }
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 600s;
    proxy_cache pxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
}
//proxy_cache zone | off;指明要调用的缓存,或关闭缓存机制;Context:  http, server, location
//proxy_cache_key string;缓存中用于“键”的内容;
默认值:proxy_cache_key $scheme$proxy_host$request_uri;
//proxy_cache_valid [code ...] time;定义对特定响应码的响应内容的缓存时长;
定义在http{...}中;
[root@centos7 nginx]#cat  nginx.conf
http {
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
//proxy_cache_path ;定义可用于proxy功能的缓存;Context:    http            
//proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] 
[purger_sleep=time] [purger_threshold=time];
[root@centos7 conf.d]#nginx -t 
[root@centos7 conf.d]#nginx -s reload

刷新几下 观察是否已缓存

[root@centos7 ~]#cd /var/cache/nginx/proxy_cache/
[root@centos7 proxy_cache]#tree

└── 6
    └── a
        └── d
            └── f7aa5e7d8164aa09aacfe1de7eb14da6
3 directories, 1 file
已成功缓存至本地磁盘
总结

到这里实验就完成,实现简单的Nginx的代理服务,可实现htpps,页面的压缩,和缓存,这些功能只是Nginx的小众功能,还可以设置更为灵活,复杂的功能。它有着大量模块支持!

实验完成的有些粗糙!如有不足请多多指教!

推荐阅读更多精彩内容

  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 2,795评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 123,044评论 18 134
  • 一、高可用集群 (一)提升系统高可用性的解决方案:冗余(redundant) 工作模式active/passive...
    哈喽别样阅读 1,212评论 2 5
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 75,638评论 21 348
  • 昨天朋友圈里上传了一张电影《一条狗的使命》截图,随后一个久未联系的老友微我,本想跟她聊一些轻松的话题,她却反复追问...
    芜野阅读 99评论 0 0
  • 今天乐燊和林煜博打架,起因是因为林妨碍了乐排练节目。我已经记不得是谁先拉扯的谁了,但是在此过程中林的把乐的鼻梁近眼...
    璐璐松鼠阅读 75评论 0 0