Nginx

nginx基础

nginx功能(php语言编写)

网站服务
网站代理(网站业务)
四层代理(其他业务,通过端口号分配)

Nginx(”engine x”)基本应用

是俄罗斯人编写的HTTP服务工具
image.png

安装nginx(环境准备)

Nginx环境准备
gcc make //源码编译软件
pcre-devel //安装可以让nginx支持正则的软件包
penssl-devel //安装可以让nginx支持安装加密网站的软件包

Nginx常用命令

1.启动nginx
./sbin/nginx -c ./conf/nginx.conf
2.停止nginx
方法1:
强制停止:./sbin/nginx -s stop
处理完请求后停止:./sbin/nginx -s quit
方法2:
ps -ef|grep nginx#找到对应的nginx进程号
正常停止:kill -15 进程号
强制停止:kill -9 进程号
3.重启新加载nginx配置文件
进入nginx安装目录执行./sbin/nginx -s reload
4.重启nginx服务
进入nginx安装目录执行./sbin/nginx -s reopen
5.查看nginx版本信息
1)只显示版本信息./sbin/nginx -v
2)显示版本信息和配置信息./sbin/nginx -v

Nginx常用模块汇总整理

为nginx增加网站认证功能

修改nginx配置文件,在40、41行添加两句

  1. vim conf/nginx.conf
  2. auth_basic "password"; //网页弹出的提示信息,此信息可能会根据不同浏览器显示效果不一,有的浏览器甚至不显示,但不影响认证功能
  3. auth_basic_user_file "/usr/local/nginx/pass"; //存放网站账户的文件
  4. sbin/nginx -s reload //重加载配置,检验之前配置,没有任何信息即可
  5. yum -y install httpd-tools //之后安装软件包
  6. htpasswd -c pass tom //创建pass文件,里面创建tom账户,之后会要求输入两次密码
  7. #然后用火狐浏览器访问192.168.2.5,可以看到输入用户名密码的对话框、输入用户名tom以及密码即可
  8. htpasswd pass jerry //追加一个账户,名字是jerry
  9. #如果要反复测试网站认证功能,需要清空浏览器的历史记录

nginx虚拟主机

修改nginx配置文件

vim nginx.conf
...
http {
server {    //第1个虚拟主机
listen 80;
server_name www.a.com;   //修改对应域名
root html;
index  index.html;
}
server {    //第2个虚拟主机
。。。。
}
}
...

搭建安全网站

对称算法 AES DES 单机数据加密 使用相同字符串加密和解密(RAR、ZIP压缩加密)
非对称算法 RSA DSA 网络数据加密 利用公钥(锁)加密,私钥(钥匙)解密(网络加密https、ssl)
信息摘要 md5 sha256 (数据完整性校验)

1)修改配置,实现安全加密网站

[root@proxy nginx]# vim conf/nginx.conf    //修改大概103~120行
    server {            //此处的虚拟主机自带ssl安全加密功能,将其范围的注释取即可
        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_c;     //这里修改页面存储目录
            index  index.html index.htm;
        }
}

2)配置文件修改好之后,再去改/etc/hosts文件添加www.c.com

[root@proxy nginx]# mkdir html_c    //创建安全网站的目录
[root@proxy nginx]# echo "nginx-C~~~~"  > html_c/index.html     //创建安全网站的页面

3)创建私钥与证书

[root@proxy nginx]# openssl genrsa > conf/cert.key   //创建私钥
[root@proxy nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem   
#创建证书,证书中包含公钥,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答,但要走完全过程
# Country Name (2 letter code) [XX]:dc    国家名
# State or Province Name (full name) []:dc    省份
# Locality Name (eg, city) [Default City]:dc     城市
# Organization Name (eg, company) [Default Company Ltd]:dc    公司
# Organizational Unit Name (eg, section) []:dc    部门
# Common Name (eg, your name or your server's hostname) []:dc    服务器名称
# Email Address []:dc@dc.com     电子邮件

4)启动服务并测试

[root@proxy nginx]# sbin/nginx    //服务没开的话开服务
[root@proxy nginx]# sbin/nginx -s reload    //已经开了的话重加载配置
[root@proxy nginx]# curl  -k  https://www.c.com     //检验,-k是忽略风险
nginx-C ~~~~      //看到这个内容就说明实验成功
[root@proxy nginx]# systemctl stop firewalld    //如果用真机的火狐浏览器测试需要
#关闭防火墙,然后输入https://www.c.com 
#火狐浏览器测试仅限于真机是windows,目前真机是linux的教学环境由于配置了dns,所以解析会失败,在linux环境只要用curl的方式成功即可

LNMP:动态网站解析

L(linux)操作系统
N(nginx)网站服务
M(mariadb(mysql)) 数据库
P(php)编写动态网站的语言工具
是一起使用来运行动态解析网站服务的软件集合
静态网站 在不同环境下,网站内容不会变化
动态网站 在不同环境下,网站内容有可能发生变化

1.准备nginx以及相关软件包

用户 – 浏览器html语言 ——动静分离—— 服务器 html页面
php 页面 —-nginx—- php-fpm

1)还原nginx服务

killall nginx  //停止nginx程序
rm -rf  /usr/local/nginx    //删除nginx原有目录
cd  /root/lnmp_soft/nginx-1.17.6
./configure  --with-http_ssl_module    //配置
make   //编译
make install   //安装

2)安装相关软件包(6个软件包)

yum -y install  mariadb  mariadb-server   //安装数据库客户端与服务端
systemctl start mariadb   //开启数据库服务
yum -y install  mariadb-devel  //安装数据库开发环境依赖包
yum -y install  php  //安装php,相当于解释器
yum -y install  php-fpm  //安装可以帮助nginx解析php语言编写的动态网站的服务
yum -y install  php-mysql   //安装php与mysql关联的软件包
systemctl start  php-fpm   //开启php-fpm服务
yum -y install net-tools
netstat  -ntulp  | grep  mysql   //检查数据库
netstat  -ntulp  | grep  php-fpm   //检查php-fpm服务

2.准备动态网站页面的测试文件

cp  ~/lnmp_soft/php_scripts/test.php  /usr/local/nginx/html   //拷贝动态网站测试页面到nginx中
cd  /usr/local/nginx
sbin/nginx       //启动nginx服务

3.修改nginx配置文件(nginx.conf)

#第65到71行去掉注释(可以用:65,71s/#//),69行不用去
location ~ \.php$ {   //~是使用正则表达式,匹配以.php结尾
            root           html;     //网站页面位置,不用改,保持默认
            fastcgi_pass   127.0.0.1:9000;  //一旦用户访问了.php结尾的文件,就让nginx找后台的php-fpm(端口号9000)
            fastcgi_index  index.php;    //动态网站的默认页面,无需修改
          # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;   //无用行,保持注释状态
            include        fastcgi.conf;  //这里是另外一个配置文件,需要改扩展名
        }

fastCGI 快速公共网关接口,可以连接如nginx等网站程序到网站的语言解释器(比如php)

FastCGI工作原理

image.png
FastCGI缺点:内存消耗大(因为是多进程,所以进程消耗更多的服务器内存)

测试有数据库的动态网站

cp  ~/lnmp_soft/php_scripts/mysql.php  /usr/local/nginx/html/   //拷贝另外一个测试页面到nginx
#浏览器打开http://192.168.2.5/mysql.php   可以看到网站显示了数据的账户信息
mysql   //进入数据库
create user dc@localhost identified by '123';   //创建测试账户
quit  //退出
#刷新http://192.168.2.5/mysql.php  可以看到新创建的用户

地址重写:

可以定义用户的访问路径可以看到的实际内容
获得一个来访的URL请求,然后改写服务器可以处理的另一个URL的过程 地址重写好处:缩短URL,隐藏实际路径提高安全性;易于记忆和键入;易于被搜索引擎收录

语法格式:rewrite 匹配路径 实际看到的页面 选项

修改nginx.conf配置文件,实现地址重写功能

地址重写测试1:相同网站不同页面

#打开配置文件,在38行添加
rewrite /a.html /b.html;  //用户访问的路径中包含a.html的话就跳转到b.html页面
#然后准备测试页面
echo "nginx-a~~" > html/a.html
echo "nginx-b~~" > html/b.html
[root@proxy nginx]# sbin/nginx -s reload
#使用浏览器访问192.168.2.5/a/a.html看到的是b.html的内容

地址重写测试2:相同网站不同页面

rewrite ^/a.html$ /b.html redirect; //在刚刚的配置中添加redirect
sbin/nginx -s reload
#使用http://192.168.2.5/a.html路径访问网站时,地址栏同时发生变化

地址重写测试3:不同网站间跳转

rewrite / http://www.tmooc.cn; //访问192.168.2.5的网站可以跳转到www.tmooc.cn
sbin/nginx -s reload

地址重写测试4:不同网站间跳转

 rewrite /(.*)http://www.tmooc.cn/$1; //访问老网站会跳到新网站,同时会携带所访问的页面(.*)正则表达式中匹配所有,()组合整体,保留复制给$1
sbin/nginx -s reload

地址重写测试5:不同浏览器跳转到不同页面

#修改配置文件,删除原有地址重写,原地添加
if ($http_user_agent ~* firefox){  # 如果用户使用了火狐浏览器
rewrite /(.*) /firefox/$1;   #就进行地址重写操作,让用户看到火狐专属页面
}      #$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器~匹配正则 *忽略大小写
sbin/nginx -s reload 
#使用火狐浏览器查看192.168.2.5/abc.html可以看到之前html/firefox目录下的页面,非火狐浏览器打开192.168.2.5/abc.html看到的是html下的页面

选项

redirect 临时重定向 状态码 302 爬虫不感兴趣
permanent 永久重定向 状态码 301 爬虫感兴趣
last 不再读其他rewrite

echo  "nginx-c~~"  >   html/c.html     //准备素材c页面
rewrite  /a.html  /b.html  last;   //不加last的话nginx会把多个rewrite语句综合处理结果就是看a页面结果跳到c页面了,加了last的话可以避免这个情况
rewrite  /b.html  /c.html ;

break 不再读其他语句

location / {     //此处为默认的location
rewrite /a.html /b.html break;    //将last改为break可以阻止后面的语句,此处如果是last则无法阻止后面location语句中的rewrite语句
            root   html;
            index  index.html index.htm;
        }
location /b.html {    //这里是新添加的location
rewrite /b.html /c.html;
}

nginx中的location配置

image.png

nginx调优(集群)

nginx代理功能

该功能可以通过组建后台集群提高网站性能

环境准备

#proxy  2.5  ;web1  2.100   ;web2  2.200
#检查ip,同网段要互通,检查yum
#在web1、web2主机安装常用软件包与网站服务httpd
yum -y install vim net-tools bash-completion psmisc httpd
systemctl start httpd    //然后将web1、web2的服务开启
systemctl stop firewalld   //关闭防火墙
#然后继续准备网站页面:
echo "web1~~" > /var/www/html/index.html   //创建测试页面,如果是web2
#主机的话要写web2~~
#回到proxy主机:
[root@proxy nginx]# curl 192.168.2.100   //到proxy主机测试
[root@proxy nginx]# curl 192.168.2.200
#接下来还原proxy主机的nginx:
[root@proxy nginx]# cd ~/lnmp_soft/
[root@proxy lnmp_soft]# killall nginx
[root@proxy lnmp_soft]# rm -rf /usr/local/nginx/
[root@proxy lnmp_soft]# rm -rf nginx-1.17.6
[root@proxy lnmp_soft]# tar -xf nginx-1.17.6.tar.gz
[root@proxy lnmp_soft]# cd nginx-1.17.6/
[root@proxy lnmp_soft]# yum -y install gcc make pcre-devel openssl-devel
[root@proxy nginx-1.17.6]# ./configure 
[root@proxy nginx-1.17.6]# make
[root@proxy nginx-1.17.6]# make  install

修改nginx配置文件实现集群功能(轮询访问-注意循环调度)

[root@proxy nginx]# vim conf/nginx.conf
upstream web {        //首先是34~37行,创建集群,集群名称叫web
server  192.168.2.100:80;   //这里是集群中的服务器ip与端口
server  192.168.2.200:80;   //第二台集群主机
}
server {
        listen       80;
        。。。。
        location / {
proxy_pass  http://web;     //在第47行,调用集群
            root   html;
            index  index.html index.htm;
        }
#之后开启nginx或者重加载nginx配置,用curl 192.168.2.5可以看到 web1 或web2页面轮询出现

集群优化

image.png
image.png

调节权重定义集群主机任务的分配量(权重值和访问比率成正比)
server 192.168.2.200:80 weight=2;   //为性能较强的集群主机配置权重
,权重越大任务的分配量就越大
[root@proxy nginx]# curl 192.168.2.5
web2~~
[root@proxy nginx]# curl 192.168.2.5
web2~~
[root@proxy nginx]# curl 192.168.2.5
web1~~

配置健康检查(默认检测1次失败认为主机故障,等待10s再次测试)
server 192.168.2.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败,则认为集群中的主机故障,之后等待30秒再次测试
sbin/nginx -s reload
#测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.2.5只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等待30秒

相同客户机访问相同服务器(ip_hash)
upstream web {
ip_hash;  //相同客户机访问相同服务器,让一个客户机访问集群时锁定一个后台服务器,避免重复登陆的问题
server 192.168.2.100:80;
server 192.168.2.200:80;
}
sbin/nginx -s reload
curl 192.168.2.5 //重加载配置后访问2.5只会看到一个网站的页面

添加down标记
upstream web {
server 192.168.2.100:80;
server 192.168.2.200:80 down; //down标记可以让集群主机暂时不参与集群活动
}
sbin/nginx -s reload
curl 192.168.2.5

使用nginx创建其他业务集群(四层代理-传输层)

环境准备
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.17.6/
[root@proxy nginx-1.17.6]# killall nginx
[root@proxy nginx-1.17.6]# rm -rf /usr/local/nginx/
./configure --with-stream --with-http_stub_status_module
//这里的--with-stream 是添加四层代理模块,可以用来创建其他业务集群, 
--with-http_stub_status_module是后面实验所需模块
make //编译
make install //安装
cd /usr/local/nginx/
sbin/nginx -V //查看安装模块情况

ssh案例应用
#打开nginx主配置文件,在16行左右(http上面),添加以下内容
stream { //创建新业务
upstream backend { //创建名叫backend的集群
server 192.168.2.100:22;  //集群中的主机使用22端口对外提供服务
server 192.168.2.200:22;
}
server {
listen 12345;  //监听端口号,不能使用22号端口,找一个没人用的端口
proxy_pass backend;  //调用集群
}
}
sbin/nginx //配置写好之后开启服务或者重加载配置文件
ssh 192.168.2.5 -p 12345 //尝试远程登录,第一次可能会连接集群的某一台主机比如web1
exit //退出
#注意:如果配置没有错误,但无法反复登陆web1与web2,可以按下列方式解决
[root@proxy nginx]# rm -rf ~/.ssh/known_hosts //每登录一次之后在proxy中删除记录文件
ssh 192.168.2.5 -p 12345 //再次尝试登录,会连接到另外一台集群主机

常见nginx的问题处理(错误代码)

image.png

301永久重定向 302临时重定向

常见http返回的状态码

404报错

修改配置文件文件内容

vim nginx.conf
.....
error_page  404      /test.jpg;  //如果客户访问了不存在的页面就显示test.jpg的内容
.....
sbin/nginx -s reload   //重加载配置
#然后找一个图片扔到/usr/local/nginx/html里面,命名为test.jpg ,  使用浏览器虽随意访问不存在的页面192.168.2.5/XXXX.html   就可以看到之前那张图片的内容
#如果真机是windows可以用mobaXterm传test.jpg文件到nginx的html目录
#如果真机是linux可以用scp命令

查看网站后台数据

—with-http_stub_status_module //该功能利用的模块,之前配置nginx已经安装
修改配置文件,添加下列内容:

location /status  {   //在error_page行上面添加此内容
stub_status on;    //显示后台的数据
allow 192.168.2.5;    //只允许2.5查看
deny all;   //拒绝其他
}
sbin/nginx -s reload    //重加载配置

使用curl 192.168.2.5/status 查看
Active connections:当前活动的连接数量(当前有多少用户访问该网站)。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。

缓存文件在客户端

用户如果反复访问服务器的相同文件可以缓存到客户机,避免服务器反复传送相同文件,节约时间
打开配置文件,在默认的location下面添加一个location

location ~* \.(jpg|html|txt|mp3)$ {     //当发现用户访问的是以.jpg或者.html等等结尾的页面时
expires 30d;   //就把上述访问的文件在客户机缓存30天
}
sbin/nginx -s reload     //配置完后重加载配置文件

使用火狐浏览器清空历史记录,然后访问192.168.2.5/test.jpg然后地址栏输入about:cache,查看disk文件的列表,找到被访问文件看最后倒数第2列(Expires)信息显示多久过期,可以看到该文件的过期时间是一个月之后,说明缓存成功

支持超长地址栏

默认情况下nginx无法支持长地址栏,会报414错误
打开配置文件,在默认的虚拟主机上方添加两行

client_header_buffer_size 200k;   //第一行表示,用户访问网站的头部信息(包含地址栏)长度支持200k大小
large_client_header_buffers 4 200k;  //第二行表示,如果200k不够,再给4个200k
sbin/nginx  -s  reload   //重加载配置

然后到lnmp_soft目录找到buffer.sh 脚本并运行(该脚本里的4.5可以修改为2.5), 看不到414报错即可./buffer.sh //执行测试脚本,可以支持超长地址栏并看到页面内容,而不是414报错 上述脚本中地址的重新赋值过程如下,最终会产生常超地址 URL=http://192.168.4.5/index.html? URL=http://192.168.4.5/index.html?v1=1 URL=http://192.168.4.5/index.html?v1=1v2=2v3=3…………………..v5000=5000

优化nginx并发

关闭proxy 和web1 防火墙与selinux

[root@web1 ~]# yum -y install httpd-tools   
ab -c 200 -n 200 http://192.168.2.5/     //用压力测试工具模拟200人,每人1次,一共200次对2.5的网站发起访问,成功
ab -c 2000 -n 2000 http://192.168.2.5/   //模拟2000人,每人1次,一共2000次对2.5的网站发起访问,失败

接下来进行优化proxy主机: 打开nginx配置文件修改第3行,第13行-

 worker_processes  2;   //开启的nginx进程数量,通常是随cpu的核心数一致
 worker_connections  50000;   //每个nginx进程支持的并发访问量

sbin/nginx  -s  reload
# proxy与web1都执行以下命令
ulimit -n     //查询系统打开文件数量的大小
ulimit -n 100000   //临时定义文件可以同时被打开的次数为10万
# 回到web1主机执行命令
ab -c 2000 -n 2000 http://192.168.2.5/   看到100%则成功
vim /etc/security/limits.conf   //打开配置文件实现永久修改,53、54行
*               soft    nofile          100000          //重启服务器才能石配置生效
*               hard    nofile         100000

修改linux系统最大打开文件数的设置

解决集群主机过多而导致用户重复登陆网站的问题

在一个集群中,如果网站需要用户输入用户名和密码登陆之后才能继续访问,那么当用户登陆其中一台集群主机之后随着继续访问页面,请求可能被代理服务器轮询到另外一台服务器上,那么对于另外一台服务器来说用户并没有登陆,想查看登陆之后的页面还需要再次登陆,这样集群主机越多需要客户重复登陆的次数就越多

1.按照下列需求部署好环境(实现web1、web2的动静分离)

在proxy主机家目录下将lnmp_soft.tar.gz拷贝到web1

[root@proxy ~]# scp lnmp_soft.tar.gz 192.168.2.100:
# 首先在web1主机:
yum -y install gcc make pcre-devel openssl-devel
[root@web1 ~]# tar -xf lnmp_soft.tar.gz
[root@web1 ~]# cd lnmp_soft/
tar -xf nginx-1.17.6.tar.gz
cd  nginx-1.17.6/
./configure   //配置     
make   //编译    
make  install   //安装
yum -y install mariadb mariadb-server mariadb-devel   //安装数据库相关软件包
yum -y install php php-mysql php-fpm   //安装php相关软件包
systemctl start mariadb
systemctl start php-fpm
[root@web1 nginx]# vim conf/nginx.conf  //修改配置文件,实现动静分离,
#修改65~71行为以下状态
vim conf/nginx.conf    //修改配置文件,实现动静分离,修改65~71行为以下状态
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
        #   fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
#配置好lnmp之后
[root@web1 nginx]# systemctl stop httpd
[root@web1 nginx]# sbin/nginx    //开启服务
#配置好lnmp之后
cd  ~/lnmp_soft/php_scripts/
tar -xf php-memcached-demo.tar.gz    //释放带登录功能的网页
cp -r php-memcached-demo/* /usr/local/nginx/html/   //拷贝页面
#到nginx中使用火狐浏览器访问http://192.168.2.100/index.php  可以看到有登录界面的网页
#web1配置好之后,web2也按照一模一样的过程配置,防火墙都要关闭

2.然后在proxy主机配置集群,注意该主机不能有动静分离的配置

upstream web {     //在默认的虚拟主机上面添加集群
        server 192.168.2.100:80;
        server 192.168.2.200:80;
}
location  /  {
     proxy_pass http://web;  //然后在默认的虚拟主机中的location里调用集群
sbin/nginx -s reload  //重新加载配置文件
#登录http://192.168.2.5/index.php  //之后测试效果,不断刷新页面,会看到web1与
#web2的登录界面(需要提前在web1与web2的index.php页面进行标记)
#注意!proxy主机不要配置动静分离,否则主机会亲自进行网站页面的解析

3.通过访问调度主机,访问web1、web2网页(需要多次登陆)

Session 存储在服务器端,保存用户名、登录状态等信息,产生sessionID
Cookies 由服务器下发给客户端,保存在客户端的一个文件,保存的主要内容是sessionID
index.php 登录前页面 home.php 登录后页面
客户 Cookies ——— proxy ——— web1 Session
——— web2 Session
目前环境搭建好之后可以按以下步骤测试:
rm -rf /var/lib/php/session/* #删除web1与web2的session文件
删除火狐浏览器的历史记录(主要是cookies文件)
访问http://192.168.2.5/index.php #登录2次才能成功,目前登录2次是正常象!!

4.服务端优化(session共享—->memcached数据库)

上述实验由于web1与web2都是在各自的/var/lib/php/session目录中存储session,所以造成客户需要重复登录,为了统一session存储的位置(该存储方式通常被称为session共享),需要安装专门的数据库工具
memcache 可以利用内存读写数据的数据库服务
proxy主机:

yum  -y  install  memcached  telnet    //安装软件包
systemctl  start  memcached   //开启服务
telnet  127.0.0.1  11211   //连接memcache,进行检测
#之后测试memcached:
set abc 0 200 3     //创建变量abc(如果abc已经存在就是覆盖),0是不压缩数据,数据存储时间200秒,存3个字符,回车之后比如输入xyz就是存储这3个字符
get abc    //获取变量abc
replace abc 0 200 3   //覆盖abc,此时变量abc必须存在
delete abc   //删除abc
add xyz 0 200 3  //添加xyz变量,如果abc已经存在则会添加失败
flush_all   //删除所有数据
quit  //退出

到web1与web2主机修改存储session文件的位置

vim  /etc/php-fpm.d/www.conf   //到最后一页
php_value[session.save_handler] = memcache  //这里改成memcache,表示session的存储不在是本地的普通文件,而是去找memcache
php_value[session.save_path] = tcp://192.168.2.5:11211   //这里的路径修改为
#安装了memcache服务的服务器地址与端口
yum -y install php-pecl-memcache   //安装php与memcached服务关联的软件包
systemctl restart php-fpm
#所有主机关闭防火墙和selinux,最后清空浏览器的历史记录,再访问http://192.168.2.5/index.php仅仅登录一次即可成功

Tomcat服务(java语言编写)

java简介

java是一种跨平台的、面向对象的程序设计语言,java技术具有卓越的通用性、高效性、平台移植性和安全性
JDK简介
JDK(Java Development Kit)是Sun针对Java开发者推出的Java语言的软件开发工具包
JDK是整个Java的核心:包括Java的运行环境、Java工具(编译、排错、打包等工具)、Java基础的库类
JRE简介
JRE(Java Runtime Environment,Java运行环境),JRE是JDK的子集,包括:Java虚拟机(jvm)、Java核心类库和支持文件、不包含开发工具(JDK)——编译器、调试器和其他工具
Java Servlet
Servlet是java拓展Web服务器功能的组件规范
常见Servlet容器:Apche(tomcat)、RedHat(Jboss)、Oracle(weblogic)、IBM(websphere)

tomcat搭建网站服务

安装tomcat(安装java环境包)

cd  ~/lnmp_soft/
tar -xf apache-tomcat-8.0.30.tar.gz
cp  -r  apache-tomcat-8.0.30  /usr/local/tomcat
cd  /usr/local/tomcat/
yum -y install java-1.8.0-openjdk

tomcat目录结构

image.png

tomcat服务启动失败解决方法

由于tomcat服务开启时需要大量随机字符,但系统中随机字符不够多的话会导致tomcat服务启动失败,解决完成后执行下列操作:
killall java //杀掉所有java程序
[root@proxy tomcat]# bin/startup.sh //重新开启服务
netstat -ntulp | grep java//检查如果有8005、8009、8080端口则正常
解决方案1
mv /dev/random /dev/random.bak //将random改名<br />ln -s /dev/urandom /dev/random //用urandom替换random
解决方案2
yum -y install rng-tools<br />systemctl start rngd

tomcat页面测试

测试静态页面

cd /usr/local/tomcat
echo "tomcat-test~~~~" > webapps/ROOT/test01.html //网页文件目录
# http://192.168.2.5:8080/test01.html 火狐访问测试

测试动态页面

vim webapps/ROOT/test02.jsp
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>

创建虚拟主机

     回顾http搭建虚拟主机
<virtualhost *:80>
servername www.a.com
documentroot /var/www/html
</virtualhost>

回顾nginx搭建虚拟主机

http {
server {
listen 80;
server_name www.a.com;
root html;
index index.html;
}
}

tomcat搭建虚拟主机

格式:

vim conf/server.xml  //打开配置文件在122行添加虚拟主机配置
<Host name="www.b.com" appBase="web_b">
</Host>
mkdir -p web_b/ROOT //之后创建b网站的目录
echo "tomcat-A~~~" > webapps/ROOT/index.html
echo "tomcat-B~~~" > web_b/ROOT/index.html
tail -1 /etc/hosts //查看域名解析
192.168.2.5 www.a.comwww.b.comwww.c.com
bin/shutdown.sh //关闭tomcat
bin/startup.sh //开启
[root@proxy tomcat]# curl www.a.com:8080 //测试
tomcat-A~~~
[root@proxy tomcat]# curl www.b.com:8080
tomcat-B~~~

再次修改虚拟主机配置(增加自动更新网站功能)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true"> //添加unpackWARs自动解war包,和autoDeploy可以自动更新开发工程师编写的网站功能代码
</Host>
bin/shutdown.sh //然后重启tomcat
bin/startup.sh //开启服务
netstat -ntulp | grep java //检查
yum -y install java-1.8.0-openjdk-devel  //安装可以制作war包的工具
jar -cf b.war /var/log //之后可以使用jar命令打war包
cp b.war web_b/ //将war包放入虚拟主机的网页目录
ls web_b/ //检查,可以看到已经自动解开

使用tomcat搭建https网站(使用端口8443)

vim conf/server.xml 
//修改配置文件,打开找到85行,将前后的注释删除 <!-- -->
 <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https"
secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/usr/local/tomcat/keystore"
keystorePass="123456" />  //这里添加keystoreFile(指定公钥私钥文件)和keystorePass(公钥私钥文件密码)
keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore
//创建密钥对,别名是tomcat,加密算法是RSA,最后是存储位置

输入密钥库口令: 输入123456
再次输入新口令: 再次输入123456
您的名字与姓氏是什么?
[Unknown]: dc
。。。。。
CN=dc, OU=dc, O=dc, L=dc, ST=dc, C=dc是否正确?
[否]: y
输入 的密钥口令
(如果和密钥库口令相同, 按回车): 直接回车

ls //检查下/usr/local/tomcat下面会产生keystore则成功
bin/shutdown.sh //重启tomcat
bin/startup.sh
netstat -ntulp | grep java  //检查可以看到8443端口
echo "tomcat-https~~" > webapps/ROOT/index.html  //准备测试页面
curl -k https://192.168.2.5:8443 //访问安全加密网站

访问路径与页面位置

Context path 匹配用户访问路径
docBase 定义页面位置
测试1(修改网页存放路径web_b)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" />  //网页文件存放在web_b/
</Host>
echo "web_b/ROOT/index.html" > web_b/ROOT/index.html //默认页面路径
echo "web_b/index.html" > web_b/index.html  //创建素材,定义新路径
curl www.b.com:8080 //测试可以看到的是默认的页面路径
web_b/ROOT/index.html
#之后重启tomcat
curl www.b.com:8080 //重启后测试可以看到新路径
web_b/index.html

测试2(网页文件存放至web_b/abc)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="abc" />  //修改成abc
</Host>
mkdir web_b/abc //创建测试目录
echo "web_b/abc/index.html" > web_b/abc/index.html  //测试页面
# 重启tomcat
[root@proxy tomcat]# curl www.b.com:8080 //查看,见到新路径
web_b/abc/index.html

测试3(网页文件存放至/abc)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/abc" />  //修改成/abc
</Host>
mkdir /abc //创建测试目录
echo "/abc/index.html" > /abc/index.html  //创建测试文件
# 重启tomcat
[root@proxy tomcat]# curl www.b.com:8080 //得到新路径
/abc/index.html

测试 4(客户访问路径/test/,访问/abc网页文件)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/abc" />  //path后面添加内容可以匹配用户访问路径,当用户访问www.b.com:8080/test/时,看到的是/abc的内容,如果访问www.b.com:8080就看到web_b/ROOT的内容
</Host>
# 重启tomcat
[root@proxy tomcat]# curl www.b.com:8080/test/ //注意最后的“/”
/abc/index.html
[root@proxy tomcat]# curl www.b.com:8080
web_b/ROOT/index.html

测试 5(客户访问路径/test/,访问web_b/abc网页文件)

<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="abc" />  //将/abc改成abc,当用户访问www.b.com:8080/test/时,可以看到web_b/abc里的内容,当用户访问www.b.com:8080时就看到web_b/ROOT的内容
# 重启tomcat
[root@proxy tomcat]# curl www.b.com:8080/test/
web_b/abc/index.html
[root@proxy tomcat]# curl www.b.com:8080
web_b/ROOT/index.html

给新创建的虚拟主机添加日志功能

vim conf/server.xml //修改配置文件,复制最后一页默认虚拟主机的日志配置其中prefix是日志名称,suffix是日志后缀名
<Host name="www.b.com" appBase="test01"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="a" />
<Context path="/abc" docBase="/var/www/html" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="www_b_com" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#配置好之后开启或者重启tomcat服务
curl www.b.com:8080 //访问一次网站,可以产生日志记录
[root@proxy tomcat]# ls logs/ 查看日志目录可以看到b网站的日志名称

maven软件项目管理工具

基于项目对象模型(POM),可以管理项目的构建、报告和文档
POM(project Object Model)项目对象模型,它是一个XML文件,包含了Meven创建项目的基本信息、构建过程、项目依赖等。
程序员编写项目时,需要使用各种依赖程序,之后还需要打包、测试之后才能发布到生产环境,这复杂的过程利用Maven可以极大的提高开发效率。

1, 将三个文件传入虚拟机root的家目录,原地释放

apache-maven-3.6.3-bin.tar.gz //maven工具包
cms.tar.gz //网站项目,代码已经都编写完毕
m2.tar.gz //依赖程序,释放之后是隐藏目录.m2
#如果有软件包无法释放可以尝试安装bzip2软件包

2,配置maven

mv apache-maven-3.6.3 /usr/local/maven //将maven移动到/usr/local下
yum -y install java-1.8.0-openjdk
yum -y install java-devel
vim /usr/local/maven/conf/settings.xml //打开配置文件在第158下面添加公网服务器地址
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
</mirror>

3,配置数据库

yum -y install mariadb mariadb-server
systemctl start mariadb
[root@proxy ~]# cd ~/CMS/
cp src/main/resources/shishuocms.properties . //拷贝网站数据库
#配置文件到当前目录,该文件定义了数据的用户名和密码等信息
mysql -uroot -p < sql/install.sql //导入网站相关数据库文件
Enter password: 直接回车
mysqladmin password //修改数据库密码
New password: //接下来输入12345678
Confirm new password: //在输入一次12345678

4,利用maven打包项目

/usr/local/maven/bin/mvn clean package //按照之前定义的公网服务器地址、数据库配置等内容打包项目,要在CSM目录下操作
rm -rf /usr/local/tomcat/webapps/ROOT //删除原有默认页面目录
cp target/shishuocms-2.0.1.war /usr/local/tomcat/webapps/ROOT.war //将新项目移动到tomcat中,然后会自动解包
#打开浏览器访问www.a.com:8080看到“师说”页面则成功
#如果tomcat恢复默认了,就打开浏览器访问192.168.2.5:8080

RPM打包

官方未提供RPM包;官方RPM无法自定义;大量源码包,希望提供统一的管理机制

打包流程

准备源码软件—->安装rpm-build——>编写编译配置文件—->编译RPM包

安装rpm-build

image.png

[root@proxy ~]# rpmbuild -ba nginx.spec //制作rpm包,但是没有配置文件会报错,报错也需要敲,会产生所需的目录
[root@proxy ~]# ls //可以看到一个rpmbuild目录

准备源码软件

[root@proxy ~]# cp ~/lnmp_soft/nginx-1.17.6.tar.gz rpmbuild/SOURCES/ 
//拷贝源码包到rpmbuild的工作目录

编写编译配置文件

image.png

image.png

image.png

vim rpmbuild/SPECS/nginx.spec //编写将nginx转换为rpm包的配置文件
Name:nginx //软件名
Version:1.17.6 //版本
Release:1 //发布的rpm包的版本
Summary:test~ //简单描述
# Group:
License:GPL  //授权协议 ,GPL表示自由软件
URL:www.abc.com//网址
Source0:nginx-1.17.6.tar.gz  //源码包 
# BuildRequires: 
# Requires:
%description //详细描述
test~ test~ 
%post  //可以添加安装rpm包之后执行的命令,不是必须
useradd nginx
%prep //释放源码包
%setup -q //进入目录
%build
./configure //配置,如果要添加选项或者模块可以继续写
make %{?_smp_mflags} //编译
%install
make install DESTDIR=%{buildroot} //安装
%files
%doc
/usr/local/nginx/*  //将改路径下文件打包成rpm
%changelog //软件修改历史

编译RPM包

确认是否安装 gcc make pcre-devel openssl-devel软件包
rpmbuild -ba rpmbuild/SPECS/nginx.spec //根据上述文件制作rpm包


VPN服务器(Virtual Private Network 虚拟专用网络)

在共用网络上建立专用私有网络,进行加密通讯;多用于为集团公司的各地子公司建立连接,连接完成后,各地子公司可以像局域网一样通讯;偶尔可用于翻墙
目前主流的VPN技术(GRE,PPTP,L2TP+IPSec,SSL)

1.使用gre技术搭建vpn,适用于linux环境

image.png

[root@web1 ~]# modprobe ip_gre  //在内核中开启gre功能
[root@web1 ~]# lsmod | grep gre //检查,可以看到gre字样信息即可
ip tunnel add tun0 mode gre remote 192.168.2.200 local 192.168.2.100 //创建vpn隧道,名字叫tun0,mode是使用gre技术,与2.200连接,自己ip是2.100
ip tunnel del tun0 //如果错误,可以删除重配
ip addr add 10.10.10.100/8 peer 10.10.10.200/8 dev tun0  //在tun0隧道(dev)中使用私有ip地址,本机是10.100 ,对面(peer)是10.200
ip addr del 10.10.10.100/8 peer 10.10.10.200/8 dev tun0 //如果错误可以删除
ip link set tun0 up //激活tun0
ip addr show tun0 //查看

2.使用pptpd搭建vpn,支持windows环境

  • image.png
    PPTP(Point to Point Tunneling Protocol);支持密码身份验证
    支持MPPE(Microsoft Point to Point Encryption)加密
    [root@web1 ~]# cd ~/lnmp_soft/vpn/
    yum -y install ppp  //安装vpn依赖软件包
    rpm -ivh pptpd-1.4.0-2.el7.x86_64.rpm //安装vpn工具
    vim /etc/pptpd.conf //修改102、103行
    localip 192.168.2.100 //本机ip
    remoteip 10.10.10.10-18 //给windows客户机分配的ip(vpn隧道内使用的地址,可以自定义),范围是10.10.10.10~10.10.10.18
    vim /etc/ppp/options.pptpd //修改配置,定义dns,66行将# 去掉
    vim /etc/ppp/chap-secrets //定义windows客户机的用户名和密码
    tom * 123456 * //另起一行创建用户tom,配置密码123456
    systemctl restart pptpd  //开服务
    netstat -ntulp | grep pptpd //检查
    #然后使用windows系统设置vpn,最下面 用户名写tom 密码123456
    

    3.使用xl2tp搭建vpn,支持windows环境,更安全

    image.png
    Layer Two Tunneling Protocol(L2TP);建立主机之间的VPN隧道,压缩,验证
    IPSec提供数据加密、数据校验、访问控制的功能
    systemctl stop pptpd
    #首先第一个环节,配置加密:
    [root@web1 vpn]# yum -y install libreswan //安装加密工具
    [root@web1 vpn]# cp myipsec.conf /etc/ipsec.d/ //复制配置文件到ipsec.d目录
    [root@web1 vpn]# vim /etc/ipsec.d/myipsec.conf  //修改配置第16行
    left=192.168.2.100  //设置为本机外网ip
    vim /etc/ipsec.secrets  //修改配置,添加加密信息
    192.168.2.100 %any: PSK "randpass" //另起一行,添加2.100是本机ip,%any:是允许任何客户机连接本服务器,PSK是预共享密钥,randpass是密码,等windows客户连接vpn服务器时需要该密码
    rpm -ivh xl2tpd-1.3.8-2.el7.x86_64.rpm
    vim /etc/xl2tpd/xl2tpd.conf  //打开配置文件,32、33行
    ip range = 10.10.10.10-10.10.10.18 //给客户分配的ip
    local ip = 192.168.2.100  //本机服务ip
    vim /etc/ppp/options.xl2tpd //修改配置文件,将第10、16行注释掉(# crtscts/lock),删除掉21行的# 以及空格,就可以启用加密
    systemctl start ipsec  //开启加密服务
    netstat -ntulp |grep :500 //之后检查加密服务
    systemctl start xl2tpd  //开启xl2tpd服务
    netstat -ntulp |grep xl2tpd
    

systemd服务管理

编写Unit文件,使systemctl命令控制nginx

systemd简介

systemd是Linux系统的一组基本构建块;它提供了一个系统和服务管理器;作为PID1运行并启动系统的其余部分进程;控制systemd的主要命令是systemctl

systemctl命令

image.png

Unit文件

systemd管理服务时会读取对应的配置文件也就是unit文件<br />读取文件的目录(优先级高到低):<br />    /etc/systemd/system<br />    /usr/lib/systemd/system
  • 语法描述:

image.png

编写Unit文件,使systemctl命令控制nginx

cd /usr/lib/systemd/system 
cp httpd.service nginx.service  //拷贝模板
vim nginx.service //修改
[Unit]
Description=The nginx HTTP Server //描述
After=network.target remote-fs.target nss-lookup.target //在网络服务、网络文件服务、域名服务的程序启动之后再启动nginx
[Service]
Type=forking //nginx是多进程类型程序,要设置为forking
ExecStart=/usr/local/nginx/sbin/nginx //当执行了systemctl start nginx之后执行的命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload //当执行了systemctl reload nginx之后执行的命令
ExecStop=/bin/kill -s QUIT ${MAINPID}  //当执行了systemctl stop nginx之后执行的命令,这里是用kill命令发送退出信号给nginx的进程号,相当于停止nginx服务,-s QUIT是发送退出信号,${MAINPID}是变量,里面存了nginx的进程号
[Install]
WantedBy=multi-user.target //支持开机自启
#然后重启服务之后可以用systemctl等命令控制nginx
#提示:必须要提前先安装好nginx服务,并且没有其他服务占用80端口!