模块化软件:功能众多,需要什么功能就下载安装什么功能,不需要就不安装
软件包:
pcre-devel:支持正则表达式(正则表达式依赖包)
openssl-devel:让nginx搭建安全加密网站(SSL加密依赖包)
配置参数:
--prefix= 指定安装目录
--user= 指定用户
--group= 指定组
--with-http_ssl_module 开启ssl加密功能
常用选项:--- -V 查看编译参数
--- -c 指定配置文件,启动服务
程序运行时,需要权限的支持,程序指定账户或用户创建指定(用户有什么权限,程序就有什么权限)
# tar -xf nginx-1.22.1.tar.gz #解包
# cd nginx-1.22.1/ #进目录
# yum -y install gcc make pcre-devel openssl-devel #编译安装工具,依赖包
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module #配置,指定安装位置,提供运行权限,安装模块(开启SSL加密功能)
# make && make install #编译安装
# cd /usr/local/nginx/ #安装目录
# ls
conf html logs sbin
# useradd nginx -s /sbin/nologin #创建用户
# sbin/nginx #起服务
# systemctl stop firewalld
# ss -ntulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=9393,fd=9),("nginx",pid=9392,fd=9))
# sbin/nginx -s stop #停服务
# sbin/nginx -V #查看软件信息
# sbin/nginx
# sbin/nginx -s reload #重载配置文件
# echo nginx-test~ > html/abc.html
# echo in-test > html/index.html
conf 配置文件 sbin 主程序
html 网页目录 logs 日志文件
nginx命令的用法
[root@proxy nginx]# useradd -s /sbin/nologin nginx
/usr/local/nginx/sbin/nginx #启动服务
/usr/local/nginx/sbin/nginx -s stop #关闭服务
/usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
/usr/local/nginx/sbin/nginx -V #查看软件信息
ss命令可以查看系统中启动的端口信息,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
nginx服务默认通过TCP 80端口监听客户端请求:
# ss -anptu | grep nginx
Nginx服务默认首页文档存储目录为/usr/local/nginx/html,在此目录下默认有一个名为index.html的文件,使用客户端访问测试页面:
# systemctl stop firewalld #关闭防火墙
# curl http://192.168.88.5
Welcome to nginx!
...
html/abc.html
html/index.html
指令 执行什么任务
配置指令 "参数";(; 表示指令结束)
指令 auth_basic
---开启用户认证功能 auth_basic
---auth_basic "password";
指令 auth_basic_user_file
---网站用户名、密码存放文件 auth_basic_user_file
---auth_basic_user_file "/usr/local/nginx/pass";
htpasswd(由httpd-tools软件包提供):创建加密格式的密码
[root@proxy nginx]# pwd #nginx安装目录
/usr/local/nginx
[root@proxy nginx]# vim conf/nginx.conf
......
server {
listen 80;
server_name localhost;
auth_basic "password"; #添加指令 认证提示符信息
auth_basic_user_file "/usr/local/nginx/pass"; #添加指令 认证的密码文件
#charset koi8-r;
location / {
root html;
index index.html index.htm;
}
}
#生成密码文件,创建用户及密码
使用htpasswd命令创建账户文件,需要确保系统中已经安装了httpd-tools
[root@proxy nginx]# yum -y install httpd-tools #安装软件包
[root@proxy nginx]# htpasswd -c pass tom #创建认证用户;-c 新创建文件
New password:
Re-type new password:
Adding password for user tom
[root@proxy nginx]# cat pass
tom:$apr1$3jI2KzIL$O.PtuBq87ItaWB3iunmTe0
[root@proxy nginx]# htpasswd pass jerry #追加账户,不使用-c选项
New password:
Re-type new password:
Adding password for user jerry
[root@proxy nginx]# cat pass
tom:$apr1$3jI2KzIL$O.PtuBq87ItaWB3iunmTe0
jerry:$apr1$wkOl6T8.$9X32i8GNkeCuEg53schba.
[root@proxy nginx]# sbin/nginx -s reload #重新加载配置文件
配置基于域名的虚拟主机,实现两个基于域名的虚拟主机,域名分别为www.a.com和www.b.com
http {
server {
listen 80;
server_name www.a.com;
root html;
index index.html;
}
}
[root@proxy nginx]# pwd
/usr/local/nginx
[root@proxy nginx]# vim conf/nginx.conf
http {
......
server { #一个server表示一个虚拟web主机
listen 80; #监听端口
server_name www.b.com; #域名(新虚拟主机定义域名)
#charset koi8-r;
#access_log logs/host.access.log main;
root html_b; #网页文件根目录(指定网站根路径)
index index.html index.htm; #首页文件/默认页面(前面的失效,访问后面的)
}
server {
listen 80;
server_name www.a.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
}
[root@proxy nginx]# sbin/nginx -s reload
#创建网站根目录及对应首页文件
[root@proxy nginx]# mkdir html_b #创建b网站的目录
[root@proxy nginx]# echo ngixn-A~~ > html/index.html #创建a网站测试页
[root@proxy nginx]# echo ngixn-B~~ > html_b/index.html #创建b网站测试页
[root@proxy nginx]# echo 192.168.99.5 www.a.com www.b.com >> /etc/hosts
[root@proxy nginx]# curl www.a.com
ngixn-A~~
[root@proxy nginx]# curl www.b.com
ngixn-B~~
另外:
windows环境配置hosts文件
C:\Windows\System32\drivers\etc\hosts
右键---属性---安全---编辑---users---完全控制打钩
然后用文本打开hosts,在最后添加
192.168.99.5 www.a.com www.b.com
server {
listen 8080; #端口
server_name www.a.com; #域名
......
}
server {
listen 8000; #端口
server_name www.a.com; #域名
.......
}
server {
listen 192.168.88.5:80; #IP地址与端口
server_name www.a.com; #域名
... ...
}
server {
listen 192.168.99.5:80; #IP地址与端口
server_name www.a.com;
... ...
}
配置基于加密网站的虚拟主机,实现以下目标:
源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)
验证数据完整性
md5 sha256
哈希值
AES、DES 主要应用在单机数据加密
用相同的密码加密和解密
应用案例:RAR、ZIP压缩加密
RSA、DSA 主要应用在网络数据加密
私钥 解密
公钥 加密
应用案例:网络加密(https、ssh)
openssl req -x509 -key conf/cert.key > conf/cert.pem
req -x509 #创建公钥
-key #根据哪一个私钥来创建公钥
conf/cert.pem #公钥文件,配置文件中(可自定义)
[root@proxy nginx]# vim conf/nginx.conf
… …
server {
listen 443 ssl;
server_name localhost;
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 https; #加密网站根目录
index index.html index.htm;
}
}
[root@proxy nginx]# openssl genrsa > conf/cert.key #生成私钥
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................+++++
............+++++
e is 65537 (0x010001)
[root@proxy nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem #生成证书,生成过程会询问诸如你在哪个国家之类的问题
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
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 []:[email protected] #邮箱
[root@proxy nginx]# ls conf/cert*
conf/cert.key conf/cert.pem
[root@proxy nginx]# mkdir https #创建安全网站的目录
[root@proxy nginx]# sbin/nginx -s reload
[root@proxy nginx]# echo nginx-https > https/index.html #创建安全网站的页面
[root@proxy nginx]# curl -k https://192.168.99.5 #-k 访问加密网站(检验,-k是忽略安全风险)
nginx-https
安装部署LNMP环境实现动态网站解析
动态网站:在不同环境访问,网站内容有可能发生变化
静态网站:在不同环境访问,网站内容不会发生变化
目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码。
因此需要整合LNMP(Linux、Nginx、Mysql、PHP)实现动态网站效果。
操作过程中需要安装的软件列表如下:
备注:php(php主程序,解释器,翻译php编程语言 动态网站)、php-mysqlnd(程序连接数据库 高效读写数据库的数据)、php-fpm(进程管理器服务)、mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(其它客户端软件的依赖包)。
php-fpm服务利用FastCGI技术 解析翻译index.php动态网站动态语言,找php主程序(主配置文件:/etc/php-fpm.d/www.conf)
php-fpm
客户 浏览器(app)---------------------网站服务器
支持 html index.html
index.php
[root@proxy nginx-1.22.1]# yum -y install gcc make openssl-devel pcre-devel
[root@proxy nginx-1.22.1]# ./configure --with-http_ssl_module
[root@proxy nginx-1.22.1]# make && make install
[root@proxy nginx-1.22.1]# ls /usr/local/nginx/
conf html logs sbin
[root@proxy nginx-1.22.1]# yum -y install mariadb mariadb-server mariadb-devel
[root@proxy nginx-1.22.1]# yum -y install php php-mysqlnd php-fpm
#启动Nginx服务,如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。
[root@proxy ~]# /usr/local/nginx/sbin/nginx #启动Nginx服务
[root@proxy ~]# ss -utnlp | grep :80
#启动MySQL服务
[root@proxy ~]# systemctl start mariadb #启动服务器
[root@proxy ~]# systemctl status mariadb #查看服务状态
[root@proxy ~]# systemctl enable mariadb #设置开机启动
#启动PHP-FPM服务
[root@proxy ~]# systemctl start php-fpm #启动服务
[root@proxy ~]# systemctl status php-fpm #查看服务状态
[root@proxy ~]# systemctl enable php-fpm #设置开机启动
#使用PHP测试页面
配置Fast-CGI支持PHP网页解析,FastCGI是快速公共(通用)网关接口,可以连接如nginx等网站程序到网站的语言解释器(比如php),php-fpm进程使用了Fast-CGI解析动态网站页面
# 打开php-fpm配置文件,注意该配置文件中;(分号)是注释
[root@proxy nginx-1.22.1]# vim /etc/php-fpm.d/www.conf
listen.acl_users = apache,nginx #用于设置允许访问FastCGI请求的用户
;listen = /run/php-fpm/www.sock #进程间通信
listen = 127.0.0.1:9000 #网络
pm.max_children = 50 #最大进程数量
pm.start_servers = 5 #最小进程数量
[root@proxy nginx-1.22.1]# systemctl restart php-fpm
# 修改配置文件并启动服务
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# vim conf/nginx.conf
......
location ~ \.php$ { #如果用户访问的路径以.php结尾(~ 支持正则)
root html;
fastcgi_pass 127.0.0.1:9000; #如果用户访问的路径以.php结尾,将页面丢给9000端口
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf; #加载fastcgi配置文件
}
[root@proxy nginx]# sbin/nginx
[root@proxy nginx]# sbin/nginx -s reload
nginx 对接 php-fpm
方式一:网络
nginx------>127.0.0.1:9000------->php-fpm(IP端口要放在php-fpm身上,这里是测试,所以使用本机回环地址)
方式二:进程间通信(socket)
nginx------>php-fpm
选项:
redirect 临时重定向,状态码302 ,爬虫不更新URI
permanent 永久重定向,状态码301 ,爬虫更新URI
last 不再读其他语句,但还会继续匹配其他location语句
echo "nginx-c~~" > html/c.html #准备素材c页面
rewrite /a.html /b.html last; #没有其他location语句时,打开b页面
rewrite /b.html /c.html ;
break 不再读其他语句,结束请求
location / { #此处为默认的location
rewrite /a.html /b.html break; #break可以阻止后面的语句
root html;
index index.html index.htm;
}
location /b.html { #这里是新添加的location
rewrite /b.html /c.html;
}
语法:
rewrite 旧地址 新地址(用户真正看到内容的地址) [选项]
修改配置文件(访问a.html重定向到b.html)
修还配置文件
[root@proxy nginx]# vim conf/nginx.conf
server {
listen 80;
server_name localhost;
rewrite /a.html /b.html;
location / {
root html;
index index.html index.htm;
}
}
[root@proxy ~]# echo "nginx-B~~" > /usr/local/nginx/html/b.html
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端测试
http://192.168.99.5/a.html
测试redirect选项
修改nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
rewrite ^/a.html$ /b.html redirect; #支持正则
location / {
root html;
index index.html index.htm;
}
}
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端测试,地址栏同时发生变化
http://192.168.99.5/a.html
不同网站间跳转
修改nginx服务配置实现访问192.168.99.5的请求重定向到www.baidu.com
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
rewrite / https://www.baidu.com/;
location / {
root html;
index index.html index.htm;
}
}
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端测试
http://192.168.99.5
修改配置文件(访问192.168.99.5/下面子页面,重定向到www.baidu.com/下相同的子页面)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
rewrite /(.*) https://www.baidu.com/$1;
location / {
root html;
index index.html index.htm;
}
}
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端测试
http://192.168.99.5/test
实现不同浏览器跳转到不同页面
#创建网页目录及对应的页面文件
[root@proxy nginx]# mkdir html/firefox
[root@proxy nginx]# echo firefox~~ > html/firefox/abc.html #火狐专用页面
[root@proxy nginx]# echo others~~ > html/abc.html #其他浏览器专用页面
火狐访问192.168.99.5/abc.html时可以看到html/firefox/abc.html里面内容
其他浏览器访问192.168.99.5/abc.html时可以看到html/abc.html里面内容
#修改nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
if ($http_user_agent ~* firefox) {
rewrite (.*) /firefox/$1;
}
}
#重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
#客户端测试
分别用火狐浏览器与其他浏览器访问相同地址http://192.168.99.5/abc.html,可以得到不同结果
[root@proxy nginx]# vim conf/nginx.conf
server {
listen 80;
server_name localhost;
rewrite ^/a\.html$ /b.html; #支持正则 地址重写
[root@proxy nginx]# sbin/nginx -s reload
[root@proxy nginx]# echo "nginx-b~~~" > html/b.html
[root@proxy nginx]# curl 192.168.99.5/a.html
nginx-b~~~
轮询 权重(weight 正整数)
为了看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容
web1(100)
搭建网站
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo httpd-web1 > /var/www/html/index.html
[root@web1 ~]# systemctl status httpd
[root@web1 ~]# systemctl enable httpd --now
[root@web1 ~]# systemctl stop firewalld.service
web2(200)
搭建网站
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo httpd-web2 > /var/www/html/index.html
[root@web2 ~]# systemctl status httpd
[root@web2 ~]# systemctl enable httpd --now
[root@web2 ~]# systemctl stop firewalld.service
nginx
测试
[root@proxy ~]# curl 192.168.99.100
httpd-web1
[root@proxy ~]# curl 192.168.99.200
httpd-web2
[root@proxy ~]#
nginx(99.5/88.5)
配置nginx服务器,添加服务器池,实现反向代理功能
upstream:定义后端服务器集群,集群名任意
server:定义集群中的具体服务器和端口
proxy_pass:将用户的请求转发给定义的集群
max_fails:设置后台服务器的失败次数
fail_timeout:设置后台服务器的失败超时时间
###默认为轮询
[root@proxy nginx]# vim conf/nginx.conf
upstream webserver { #创建集群 集群名
server 192.168.99.100:80;
server 192.168.99.200:80;
}
location / { #调用集群写在server location中
proxy_pass http://webserver; #调用集群
root html;
index index.html index.htm;
}
[root@proxy nginx]# sbin/nginx
###权重
[root@proxy nginx]# vim conf/nginx.conf
upstream webserver {
server 192.168.99.100:80 weight=2; #权重
server 192.168.99.200:80;
}
[root@proxy nginx]# sbin/nginx -s reload
###健康检查
[root@proxy nginx]# vim conf/nginx.conf
upstream webserver {
server 192.168.99.100:80;
server 192.168.99.200:80 max_fails=2 fail_timeout=30;
}
[root@proxy nginx]# sbin/nginx -s reload
###ip_hash
[root@proxy nginx]# vim conf/nginx.conf
upstream webserver {
ip_hash;
server 192.168.99.100:80;
server 192.168.99.200:80 max_fails=2 fail_timeout=30;
}
[root@proxy nginx]# sbin/nginx -s reload
###down
[root@proxy nginx]# vim conf/nginx.conf
upstream webserver {
server 192.168.99.100:80 down;
server 192.168.99.200:80;
}
[root@proxy nginx]# sbin/nginx -s reload
ngx_stream_core_module 模块,使用 --with-stream 开启4层代理模块
[root@proxy nginx-1.22.1]# ./configure --with-stream && make && make install
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
configure arguments: --with-stream
[root@proxy nginx]# vim conf/nginx.conf
stream {
upstream backend {
server 192.168.99.100:22;
server 192.168.99.200:22;
}
server {
listen 12345; #Nginx监听的端口
proxy_pass backend;
}
}
[root@proxy nginx]# sbin/nginx
[root@proxy nginx]# ss -ntulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=7145,fd=9),("nginx",pid=7144,fd=9))
tcp LISTEN 0 128 0.0.0.0:12345 0.0.0.0:* users:(("nginx",pid=7145,fd=8),("nginx",pid=7144,fd=8))
[root@proxy nginx]# ssh 192.168.99.5 -p 12345 #登录 proxy
The authenticity of host '[192.168.99.5]:12345 ([192.168.99.5]:12345)' can't be established.
ECDSA key fingerprint is SHA256:8A1PH0kOhJh281xagiAoQedjcQHNb/QXlme9hzrcii4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.99.5]:12345' (ECDSA) to the list of known hosts.
[email protected]'s password: #后端真实服务器的密码
Last login: Mon Dec 11 11:09:13 2023
[root@web1 ~]# exit #实际登录到 web1
注销
Connection to 192.168.99.5 closed.
[root@proxy nginx]# ssh 192.168.99.5 -p 12345 #登录 proxy
[email protected]'s password: #后端真实服务器的密码
Last login: Mon Dec 11 09:28:57 2023 from 192.168.99.254
[root@web2 ~]# #实际登录到 web2
网站
HTTP常见状态码列表:
200:正常
301 & 302:重定向
400:请求语法错误
401:访问被拒绝(账户或密码错误)
403:禁止访问
404:资源找不到
414:请求URI头部太长
500:服务器内部错误
502:代理服务器无法正常获取下一个服务器正常的应答
[root@proxy nginx]# vim conf/nginx.conf
charset utf-8;
error_page 404 /404.html;
[root@proxy nginx]# echo "抱歉!页面不存在!" > html/404.html
[root@proxy nginx]# sbin/nginx -s reload
如何查看服务器状态信息
编译安装时使用 --with-http_stub_status_module 开启状态页面模块
如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下面的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序,然后killall nginx 再重启即可
Active connections:当前活动的连接数量
accepts:已经接受客户端的连接总数量
handled:已经处理客户端的连接总数量
requests:客户端发送的请求数量
Reading:当前服务器正在读取客户端请求头的数量
Writing:当前服务器正在写响应信息的数量
Waiting:当前多少客户端在等待服务器的响应
[root@proxy nginx-1.22.1]# killall nginx
[root@proxy nginx-1.22.1]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure --with-stream --with-http_stub_status_module && make
[root@proxy nginx-1.22.1]# ls objs/nginx
[root@proxy nginx-1.22.1]# objs/nginx -V
[root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# sbin/nginx -V
[root@proxy nginx]# vim conf/nginx.conf
location /status {
stub_status on;
allow 192.168.99.5;
deny all;
}
[root@proxy nginx]# sbin/nginx
[root@proxy nginx]# curl 192.168.99.5/status
Active connections: 1
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
优化Nginx并发量
使用web1作为海量客户
-n 任务量
-c 连接数
[root@web1 ~]# ab -n 100 -c 100 http://192.168.99.5/
...
...
100% 9 (longest request) #成功
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
socket: Too many open files (24) #失败
修改Nginx配置文件,增加并发量
[root@proxy nginx]# vim conf/nginx.conf
worker_processes 2; #与CPU核心数量一致
events {
worker_connections 50000; #每个worker最大并发连接数
}
[root@proxy nginx]# sbin/nginx -s reload
优化Linux内核参数(最大文件数量)
[root@proxy nginx]# ulimit -n #查看最大文件数量
[root@proxy nginx]# ulimit -n 100000 #临时设置最大文件数量
[root@proxy nginx]# vim /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
用户或组 硬限制或软限制 需要限制的项目 限制的值
优化后测试服务器并发量
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
支持超长地址
用户 浏览器---------------请求头---------------nginx 缓存1K(针对的是一个人,一人1k)
[root@proxy nginx]# vim conf/nginx.conf
client_header_buffer_size 200k; #设置nginx缓存
large_client_header_buffers 4 200k; #200不够时,再给4个200k
[root@proxy nginx]# sbin/nginx -s reload
本地缓存数据
本地指的是客户
[root@proxy nginx]# vim conf/nginx.conf
location ~* \.(jpg|html|mp4|txt)$ {
expires 30d;
}
[root@proxy nginx]# sbin/nginx -s reload
session 共享
利用redis数据库存放session文件,实现session文件的共享,解决客户重复登录的问题
web1、web2
[root@web2 ~]# yum -y install gcc make pcre-devel openssl-devel
[root@web2 ~]# yum -y install mariadb mariadb-server mariadb-devel php php-fpm php-mysqlnd
[root@web2 nginx-1.22.1]# ./configure && make && make install #没有指定运行用户,默认为nobody用户
[root@web2 nginx-1.22.1]# cd /usr/local/nginx/
[root@web2 nginx]# yum -y install gcc make pcre-devel openssl-devel
[root@web2 nginx]# vim /etc/php-fpm.d/www.conf
listen = /run/php-fpm/www.sock #进程间通信(socket)
listen.acl_users = apache,nginx,nobody #添加nobody用户
[root@web2 nginx]# vim conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@web2 nginx]# systemctl restart php-fpm
[root@web2 nginx]# sbin/nginx
[root@web2 nginx]# tar -xf ~/lnmp_soft/php_scripts/php-session-demo.tar.gz
[root@web2 nginx]# cp -r php-session-demo/* html/
[root@web2 nginx]# systemctl disable firewalld --now
###为测试结果明显,改动首页文件
[root@web1 nginx]# vim html/index.php
Web1 PHP Login Session Example
[root@web2 nginx]# vim html/index.php
Web2 PHP Login Session Example
session
存在服务器端的文件,保存了用户名、登录状态等信息
/var/lib/php/session/ #存放session文件的目录
cookies
由服务器端下发给客户端的文件,保存内容主要是sessionID(一串随机字符串---客户端和服务器持有)
redis是一种数据库,用来实现session共享
redis---用内存存数据,内存存放的是临时数据
键值对
###redis所在服务器
[root@proxy nginx]# yum -y install redis #安装
[root@proxy nginx]# systemctl start redis #启服务
[root@proxy nginx]# ss -ntulp | grep redis
tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=2204,fd=6))
[root@proxy nginx]# vim /etc/redis.conf
#bind 127.0.0.1 #将起作用的bind这行注释
protected-mode no #关闭保护模式
[root@proxy nginx]# systemctl restart redis
[root@proxy nginx]# ss -ntulp | grep redis
tcp LISTEN 0 128 0.0.0.0:6379 0.0.0.0:* users:(("redis-server",pid=2287,fd=7))
###后端真实服务器(以web1示例)
[root@web1 session]# vim /etc/php-fpm.d/www.conf
php_value[session.save_handler] = redis #以什么格式存放session文件
php_value[session.save_path] = "tcp://192.168.99.5:6379" #session文件存放在哪
[root@web1 session]# systemctl restart php-fpm
[root@web1 session]# cd ~/lnmp_soft/php_scripts/
[root@web1 php_scripts]# ls phpredis-5.1.0-1.x86_64.rpm
phpredis-5.1.0-1.x86_64.rpm
[root@web1 php_scripts]# yum -y install phpredis-5.1.0-1.x86_64.rpm
###注意:
selinux模式、防火墙
它定义了浏览器访问网站时,需要域名、协议、端口相同
是重要的安全策略,防止了恶意数据的传递
创建两个虚拟主机,分别是80端口和8080端口
[root@proxy nginx]# vim conf/nginx.conf
server {
listen 8080;
charset utf-8;
location / {
root html;
index index.html;
}
}
[root@proxy nginx]# sbin/nginx -s reload
uwsgi
uWSGI是一个Web服务器
主要用途是将 Web 应用程序部署到生产环境中
可以用来连接Nginx服务与Python动态网站
部署Python网站项目
Python安装
#安装编译工具
#安装Python与依赖
[root@proxy ~]# yum -y install gcc make python3 python3-devel
安装web项目工具与依赖
Python的web项目可以由不同的辅助工具完成,比如Flask和Django
将提前准备好的资料/python拷贝到虚拟机
[root@proxy python]# pip3 install pytz-2022.6-py2.py3-none-any.whl #动态页面依赖包
[root@proxy python]# pip3 install Django-1.11.8-py2.py3-none-any.whl #同上
[root@proxy python]# pip3 install django-bootstrap3-11.0.0.tar.gz #同上
测试项目
通过Python开启网站,仅用于测试
[root@proxy python]# tar -xf python-project-demo.tar.gz #测试成品网站
[root@proxy python]# cd python-project-demo/
[root@proxy python-project-demo]# python3 manage.py runserver 0.0.0.0:8000
在浏览器访问192.168.99.5:8000
安装uWSGI
[root@proxy python-project-demo]# cd ..
[root@proxy python]# pip3 install uWSGI-2.0.21.tar.gz
[root@proxy python]# vim myproject.ini
[uwsgi]
socket=127.0.0.1:8000 #与web服务(nginx)通信的接口
chdir=/root/python/python-project-demo #项目的工作目录
wsgi-file=learning_log/wsgi.py #指定项目中的wsgi.py配置文件
daemonize=/var/log/uwsgi.log #指定日志文件位置
#processes=4 #指定启动进程的数目
#master=true #开启主进程管理模式
运行uWSGI
[root@proxy python]# uwsgi --ini myproject.ini #读取myproject.ini运行uWSGI
修改nginx配置文件,添加uWSGI转发
[root@proxy python]# vim /usr/local/nginx/conf/nginx.conf
...
location / {
uwsgi_pass 127.0.0.1:8000; #动态页面交给uWSGI
include uwsgi_params; #调用uWSGI配置文件
root html;
index index.html index.htm;
}
...
[root@proxy python]# /usr/local/nginx/sbin/nginx
测试
使用浏览器访问192.168.99.5
灰度发布
配置Nginx实现用IP测试灰度发布
不同IP的客户访问相同代理时,可以看到不同集群主机的内容
创建不同集群,准备多台集群主机,通过$remote_addr变量识别不同客户机
nginx配置创建集群
[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...
upstream s8001 { #测试集群1
server 192.168.99.100:8001;
}
upstream s8002 { #测试集群2
server 192.168.99.200:8002;
}
upstream default { #正常业务集群
server 192.168.99.100:80;
server 192.168.99.200:80;
}
server {
listen 80;
server_name localhost;
...
set $group "default"; #定义变量$group,默认值default
if ($remote_addr ~ "192.168.99.1"){ #如果客户机ip是99.1就访问集群1
set $group s8001;
}
if ($remote_addr ~ "192.168.99.2"){ #如果客户机ip是99.2就访问集群2
set $group s8002;
}
location / {
proxy_pass http://$group; #调用集群
root html;
index index.html index.htm;
}
...
}
[root@proxy nginx]# sbin/nginx -s reload
为web1新建nginx虚拟主机
[root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...
server {
listen 8001;
server_name localhost;
root html8001;
index index.html;
}
...
}
[root@proxy nginx]# sbin/nginx -s reload
[root@web1 nginx]# mkdir html8001
[root@web1 nginx]# echo web1-8001 > html8001/index.html
为web2新建nginx虚拟主机
[root@web2 nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...
server {
listen 8002;
server_name localhost;
root html8002;
index index.html;
}
...
}
[root@proxy nginx]# sbin/nginx -s reload
[root@web2 nginx]# mkdir html8002
[root@web2 nginx]# echo web1-8002 > html8002/index.html
测试
192.168.99.1访问192.168.99.5
192.168.99.2访问192.168.99.5
其他ip访问192.168.99.5
通过不同用户ID测试灰度发布
不同ID的客户访问相同代理时,可以看到不同集群主机的内容
使用php页面,定义不同匹配语句
nginx配置可以解析动态网页
[root@proxy nginx]# vim html/home.php #修改php页面,将原有Welcome那行修改成以下状态
Welcome : 开始";
}
else
{
echo "开始";
}
?>
测试
浏览器访问192.168.99.5/index.php分别输入不同名称的账户,可以看到"开始"连接的是不同的地址
referer字段 现在要访问的地址的上一页面