https nginx tomcat web服务器的搭建
http
• 提供的默认配置
– Listen:监听地址:端口(80)
– ServerName:本站点注册的DNS名称(空缺)
– DocumentRoot:网页根目录(/var/www/html)
– DirectoryIndex:起始页/首页文件名(index.html)
主配置文件:/etc/httpd/conf/httpd.conf
<Directory />
Require all denied #拒绝所有人访问
</Directory>
<Directory "/var/www">
Require all granted #允许所有人访问
• 配置文件路径
– /etc/httpd/conf/httpd.conf #主配置文件
– /etc/httpd/conf.d/*.conf #调用配置文件
• 为每个虚拟站点添加配置
<VirtualHost IP地址:端口>
ServerName 此站点的DNS名称
DocumentRoot 此站点的网页根目录
</VirtualHost>
<VirtualHost IP地址:端口>
ServerName 此站点的DNS名称
DocumentRoot 此站点的网页根目录
</VirtualHost>
nginx
yum -y install bash-completion //安装支持tab键的软件包
装好之后,使用exit退出,重新登录才生效
Yum -y install net-tools //安装网络相关软件包
yum -y install psmisc //安装支持killall命令的软件
yum -y install bash-completion //安装支持tab键的软件包
装好之后,使用exit退出,重新登录才生效
Yum -y install net-tools //安装网络相关软件包
yum -y install psmisc //安装支持killall命令的软件
yum -y install gcc make //安装编译工具
yum -y install pcre-devel //安装可以让nginx支持正则的软件包
yum -y install openssl-devel //安装可以让nginx支持安装加密网站
./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
//配置,--prefix是指定安装路径,--user是指定用户
--with-http_ssl_module是安全网站模块
ls /usr/local/nginx/ //安装好之后查看目录
conf 存放配置文件 sbin 存放主程序
html 存放网站页面 logs 存放日志
sbin/nginx -V
nginx增加网站认证功能
修改nginx配置文件,在40、41行添加两句
vim conf/nginx.conf
auth_basic "password"; //网页弹出的提示信息,此信息可能会根据
不同浏览器显示效果不一,有的浏览器甚至不显示,但不影响认证功能
auth_basic_user_file "/usr/local/nginx/pass"; //存放网站账户的文件
sbin/nginx -s reload //重加载配置,检验之前配置,没有任何信息即可
yum -y install httpd-tools //之后安装软件包
htpasswd -c pass tom //创建pass文件,里面创建tom账户,之后
会要求输入两次密码
然后用火狐浏览器访问192.168.2.5,可以看到输入用户名密码的对话框、
输入用户名tom以及密码即可
htpasswd pass jerry //追加一个账户,名字是jerry
nginx配置虚拟主机
http {
server { //第1个虚拟主机
listen 80;
server_name www.a.com;
root html;
index index.html;
}
server { //第2个虚拟主机
。。。。
。。。。
}
}
autoindex on; 表示自动在index.html的索引打开
autoindex_exact_size on; 表示如果有文件则显示文件大小
autoindex_localtime on; 表示显示更改时间,以当前系统时间为准
打开nginx主配置文件在34~39行添加:
server {
listen 80; //监听端口号
server_name www.b.com; //域名,默认的虚拟主机改成www.a.com
root html_b; //存放网页的目录
index index.html; //默认页名字
}
sbin/nginx -s reload //之后重新加载配置文件,服务必须是开启状态
搭建安全网站
vim conf/nginx.conf //修改大概103~120行,如果配置恢复了,就找98~115行
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;
}
}
openssl genrsa > conf/cert.key //创建私钥
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 电子邮件
LNMP
yum -y install mariadb mariadb-server mariadb-deve //安装数据库客户端与服务端
php //安装php,相当于解释器
yum -y install php-fpm php 安装php,相当于解释器 //安装可以帮助nginx解析php语言编写的动
态网站的服务
yum -y install php-mysql //安装php与mysql关联的软件包
systemctl start php-fpm
nginx配置文件,第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等网站程序到网站
地址重写
可以定义用户的访问路径可以看到的实际内容
rewrite 匹配路径 实际看到的页面 选项
打开配置文件,在38行添加
rewrite /a.html /b.html; //用户访问的路径中包含a.html的话
就跳转到b.html页面
地址重写测试3:不同网站间跳转
rewrite / http://www.tmooc.cn; //访问192.168.2.5的网站可以
地址重写测试2:相同网站不同页面
rewrite ^/a\.html$ /b.html redirect; //在刚刚的配置中添加redirect
地址重写测试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的内置变量,存储了用户的信息,比如用的什么浏览器
~匹配正则 *忽略大小写
选项
redirect 临时重定向 状态码 302 爬虫不感兴趣
permanent 永久重定向 状态码 301 爬虫感兴趣
以下两种写法对于用户来说效果一样,但是对百度这样的网站不同
rewrite ^/a.html$ /b.html permanent;
rewrite ^/a.html$ /b.html redirect;
last 不再读其他rewrite
rewrite /a.html /b.html last; //不加last的话nginx会把多个rewrite语句综合处理
结果就是看a页面结果跳到c页面了,加了last的话可以避免这个情况
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配置文件实现集群功能
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页面轮询出现
优化
server 192.168.2.200:80 weight=2; //为性能较强的集群主机配置权重
,权重越大任务的分配量就越大
1, 配置健康检查
server 192.168.2.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败
,则认为集群中的主机故障,之后等待30秒再次测试
相同客户机访问相同服务器
upstream web {
ip_hash; //相同客户机访问相同服务器,让一个客户机访问集群时锁定
一个后台服务器,避免重复登陆的问题
server 192.168.2.100:80;
server 192.168.2.200:80;
server 192.168.2.200:80 down; //down标记可以让集群主机暂时不参与集群活动
四层代理
./configure --with-stream --with-http_stub_status_module
//这里的--with-stream 是添加四层代理模块,可以用来创建其
他业务集群,--with-http_stub_status_module是后面实验所需模块
另外,如果更新模块,但不想删除之前nginx数据,可以将nginx源码目录下的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序,然后killall nginx 再重启即可
打开nginx主配置文件,在16行左右(http上面),添加以下内容
stream { //创建新业务
upstream backend { //创建名叫backend的集群
server 192.168.2.100:22; //集群中的主机使用22端口对外提供服务
server 192.168.2.200:22;
}
server {
listen 12345; //监听端口号
proxy_pass backend; //调用集群
}
}
sbin/nginx //配置写好之后开启服务或者重加载配置文件
ssh 192.168.2.5 -p 12345 //尝试远程登录,第一次可能会连接集群的某一台主机比如web1
exit //退出
ss命令可以查看系统中启动的端口信息,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
注意:在RHEL7系统中可以使用ss命令替代netstat命令,功能一样,选
404报错
打开配置文件,在默认的虚拟主机里面的location下面修改
error_page 404 /test.jpg; //这里把#注释去掉,后面改成test.jpg
查看网站后台数据
--with-http_stub_status_module //该功能利用的模块,之前配置nginx已经安装
打开配置文件
location /status { //在error_page行上面添加此内容
stub_status on; //显示后台的数据
allow 192.168.2.5; //只允许2.5查看
deny all; //拒绝其他
}
curl 192.168.2.5/status 查看
Active connections:当前活动的连接数量(当前有多少用户访问该网站)。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
nginx问题处理
1, 缓存文件在客户端
用户如果反复访问服务器的相同文件可以缓存到客户机,避免
服务器反复传送相同文件,节约时间
打开配置文件,在默认的location下面添加一个location
location ~* \.(jpg|html|txt|mp3)$ { //当发现用户访问的是
以.jpg或者.html等等结尾的页面时
expires 30d; //就把上述访问的文件在客户机缓存30天
}
支持超长地址栏
默认情况下nginx无法支持长地址栏,会报414错误
打开配置文件,在默认的虚拟主机上方添加两行
client_header_buffer_size 200k; //第一行表示,用户访问网站的头部信
息(包含地址栏)长度支持200k大小
large_client_header_buffers 4 200k; //第二行表示,如果200k不够,再
给4个200k
优化nginx并发
• 隐藏版本信息
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
17 http {
18 server_tokens off;
• 防止DOS、DDOS攻击
• DDOS:分布式拒绝服务
# 压力测试,每批次发送100个请求给web服务器,一共发200个
[root@zzgrhel8 ~]# yum install -y httpd-tools
[root@zzgrhel8 ~]# ab -c 100 -n 200 http://192.168.4.11/
... ...
Benchmarking 192.168.4.11 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests # 发送200个请求完成
... ...
Complete requests: 200 # 完成了200个请求
Failed requests: 0 # 0个失败
... ...
• 配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
17 http {
18 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 添加
... ...
37 server {
38 listen 80;
39 server_name localhost;
40 limit_req zone=one burst=5; # 添加
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 再次测试
[root@zzgrhel8 ~]# ab -c 100 -n 200 http://192.168.4.11/
... ...
Benchmarking 192.168.4.11 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests
... ...
Complete requests: 200
Failed requests: 194 # 失败了194个
... ...
拒绝某些类型的请求
• 用户使用HTTP协议访问服务器,一定是通过某种方法访问的。
• 最常用的HTTP方法
– GET:在浏览器中输入网址、在页面中点击超链接、搜索表单。
– POST:常用于登陆、提交数据的表单
• 其他HTTP方法不常用,如:
– HEAD:获得报文首部。HEAD 方法和 GET 方法一样,只是不返回报文主体部分。
– PUT:传输文件。要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
– DELETE:删除文件。DELETE 方法按请求 URI 删除指定的资源。
# 使用GET和HEAD方法访问nginx。两种方法都可以访问
[root@zzgrhel8 ~]# curl -i -X GET http://192.168.4.11/
[root@zzgrhel8 ~]# curl -i -X HEAD http://192.168.4.11/
# 配置nginx只接受GET和POST方法
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
37 server {
38 listen 80;
39 if ($request_method !~ ^(GET|POST)$ ) {
40 return 444;
41 }
... ...
# $request_method是内置变量,表示请求方法。~表示正则匹配,!表示取反。^表示开头,$表示结尾,|表示或
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 使用GET和HEAD方法访问nginx。只有GET可以工作
[root@zzgrhel8 ~]# curl -i -X GET http://192.168.4.11/
[root@zzgrhel8 ~]# curl -i -X HEAD http://192.168.4.11/
附:取出nginx.conf中注释和空行以外的行
# -v是取反。^ *#表示开头有0到多个空格,然后是#。^$表示空行
[root@node1 ~]# egrep -v '^ *#|^$' /usr/local/nginx/conf/nginx.conf
防止缓冲区溢出
• 缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。
• 漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。
# 配置nginx缓冲区大小,防止缓冲区溢出
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
17 http {
18 client_body_buffer_size 1k;
19 client_header_buffer_size 1k;
20 client_max_body_size 1k;
21 large_client_header_buffers 2 1k;
... ...
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
nginx配置文件修改第3行,第13行-
worker_processes 2; //开启的nginx进程数量,通常是随cpu的核心数一致
worker_connections 50000; //每个nginx进程支持的并发访问量
ulimit -n //查询系统打开文件数量的大小
ulimit -n 100000 //临时定义文件可以同时被打开的次数为10万
vim /etc/security/limits.conf //打开配置文件实现永久修改
修改第53、54行
* soft nofile 100000
* hard nofile 100000
解决集群主机过多而导致用户重复登陆网站的问题
然后在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 //重新加载配置文件
memcache 可以利用内存读写数据的数据库服务 端口 11211
主机修改存储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
tomcat
yum -y install java-1.8.0-openjdk //安装java程序运行环境包
tomcat目录:
bin 存放主程序
logs 存放日志
conf 配置文件
webapps 存放网站页面
lib 存放库文件
work 存放编译后页面文件
bin/startup.sh //开启服务
bin/shutdown.sh //然后重启tomcat
检查如果有8005、8009、8080端口则正常
由于tomcat服务开启时需要大量随机字符,但系统中随机字符
不够多的话会导致tomcat服务启动失败
解决方案1:
mv /dev/random /dev/random.bak //将random改名
ln -s /dev/urandom /dev/random //用urandom替换random
解决方案2:
yum -y install rng-tools
systemctl start rngd
tomcat搭建虚拟主机
<Host name=域名 appBase=网站页面位置 >
</Host>
vim conf/server.xml //打开配置文件在122行添加虚拟主机配置
<Host name="www.b.com" appBase="web_b"> //这里顺便把下面的默认的
虚拟主机的name="localhost"改成 name="www.a.com"
</Host>
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true"> //添加unpackWARs自动
解war包,和autoDeploy可以自动更新开发工程师编写的网站功能代码
</Host>
tomcat访问路径与页面位置
Context path 匹配用户访问路径
docBase 定义页面位置
测试 1:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" />
</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:
<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:
<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:
<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:
<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="abc" />
<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搭建https网站
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
输入 <tomcat> 的密钥口令
(如果和密钥库口令相同, 按回车): 直接回车
Warning:
ls //检查下/usr/local/tomcat下面会产生keystore则成功
yum -y install rpm-build //安装制作rpm包的工具
[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的工作目录
[root@proxy ~]# yum -y install gcc make pcre-devel openssl-devel
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
rpmbuild -ba rpmbuild/SPECS/nginx.spec //根据上述文件制作rpm包
ls rpmbuild/RPMS/x86_64/nginx-1.17.6-1.x86_64.rpm //查看最终结果,
已经产生nginx的rpm包则成功