Nginx
软件包:vim编辑器、bash-completion支持tab键的软件包、net-tools安装网络相关软件包(如ifconfig)、psmisc支持killall命令的软件、gcc编译工具、make编译工具、pcre-devel让nginx支持正则的软件包、openssl-devel让nginx支持安装加密网站
配置:./configure –prefix=/usr/local/nginx –user=nginx –with-http_ssl_module
–prefix指定安装路径 –user指定用户 –with-http_ssl_module安全网站模块
编译make、安装make install
创建nginx用户要求不允许登录
开服务sbin/nginx 关服务sbin/nginx -s stop 只重载配置sbin/nginx -s reload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #server { #listen 80; #server_name www.b.com; #root html_b; #index index.html; #} server { listen 80; server_name localhost#www.a.com; #记得要有dns或本地host解析域名 #auth_basic "password"; #网页弹出的提示信息,此信息可能会根据不同浏览器显示效果不一,有的浏览器甚至不显示,但不影响认证功能 #auth_basic_user_file "/usr/local/nginx/pass"; #存放网站账户的文件,创建pass文件,里面创建tom账户输入命令htpasswd -c pass tom,之后会要求输入两次密码 location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #server {#此处的虚拟主机自带ssl安全加密功能,将其范围的注释取消即可 # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; #证书,包含公钥 # ssl_certificate_key cert.key; #私钥 # #命令创建私钥和证书 # #openssl genrsa > conf/cert.key //创建私钥 # #openssl req -x509 -key conf/cert.key > conf/cert.pem 创建证书,证书中包含公钥,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答,但要走完全过程 # 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; # } #} }
|
部署LNMP环境
- L linux N nginx M mariadb(mysql) P php
1、准备nginx以及相关软件包
killall终止Nginx程序、删除文件重新配置(./configure –user=nginx –with-http_ssl_module)、编译、安装
装数据库包、客户端包 mariadb、mariadb-server和mariadb-devel数据库开发环境依赖包,开启数据库服务
安装php(相当于解释器)、安装可以帮助nginx解析php语言编写的动态网站的服务包php-fpm、安装php与mysql关联的软件包php-mysql,开启php-fpm服务
netstat -ntulp | grep mysql //检查数据库
netstat -ntulp | grep php-fpm //检查php-fpm服务
2、准备动态网站页面的测试文件
地址重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; #rewrite /a.html /b.html; #用户访问的路径中包含a.html的话就跳转到b.html页面;(后面加last可以让网站跳转后不再读其他rewrite;加break将不再读其他语句。) #rewrite ^/a\.html$ /b.html redirect; #问网站时,地址栏同时发生变化;redirect临时重定向;permanent永久重定向 #rewrite / http://www.baidu.com; #访问192.168.99.5的网站可以跳转到www.baidu.com #rewrite /(.*) http://www.baidu.com/$1; if ($http_user_agent ~* firefox){ #如果用户使用了火狐浏览器 rewrite /(.*) /firefox/$1; #就进行地址重写操作,让用户看到火狐专属页面 } #$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器, ~匹配正则 *忽略大小写 location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
|
Nginx代理功能
1 2 3 4 5 6 7 8 9 10 11 12
| upstream web { #在http{}中server{}外上面,创建集群,集群名称叫web server 192.168.99.100:80; #这里是集群中的服务器ip与端口 server 192.168.99.200:80; #第二台集群主机 } server { listen 80; 。。。。 location / { proxy_pass http://web; #在sever{}中,调用集群 root html; index index.html index.htm; }
|
集群优化
1 2
| server 192.168.99.200:80 weight=2; //为性能较强的集群主机配置权重 ,权重越大任务的分配量就越大
|
1 2
| server 192.168.99.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败,则认为集群中的主机故障,之后等待30秒再次测试 //输入sbin/nginx -s reload重置配置文件
|
1 2 3 4 5
| upstream web { ip_hash; //相同客户机访问相同服务器,让一个客户机访问集群时锁定一个后台服务器,避免重复登陆的问题 server 192.168.99.100:80; server 192.168.99.200:80; }
|
1 2 3 4
| upstream web { server 192.168.99.100:80; server 192.168.99.200:80 down; //down标记可以让集群主机暂时不参与集群活动 }
|
nginx功能
- 网站服务,网站代理(网站业务),四层代理(其他业务)
1 2 3 4 5 6 7 8 9 10 11 12 13
| ./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.99.100:22; //集群中的主机使用22端口对外提供服务 server 192.168.99.200:22; } server { listen 12345; //监听端口号 proxy_pass backend; //调用集群 } }
|
- 如果配置没有错误,但无法反复登陆web1与web2,可以按下列方式解决:
1
| rm -rf ~/.ssh/known_hosts //每登录一次之后在proxy中删除记录文件
|
1 2 3 4 5 6 7 8 9
| ss命令可以查看系统中启动的端口信息,该命令常用选项如下: -a显示所有端口的信息 -n以数字格式显示端口号 -t显示TCP连接的端口 -u显示UDP连接的端口 -l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口 -p显示监听端口的服务名称是什么(也就是程序名称) 注意:在RHEL7系统中可以使用ss命令替代netstat命令,功能一样,选 项一样。
|
nginx问题处理
1 2 3
| 打开配置文件,在默认的虚拟主机里面的location下面修改 error_page 404 /test.jpg; //这里把#注释去掉,后面改成test.jpg,效果是如果客户访问了不存在的页面就显示test.jpg的内容 然后找一个图片扔到/usr/local/nginx/html里面,命名为test.jpg
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| //用到--with-http_stub_status_module模块 //打开配置文件 location /status { //在error_page行上面添加此内容 stub_status on; //显示后台的数据 allow 192.168.99.5; //只允许proxy查看 deny all; //拒绝其他 }
使用curl 192.168.99.5/status 查看 Active connections:当前活动的连接数量(当前有多少用户访问该网站)。 Accepts:已经接受客户端的连接总数量。 Handled:已经处理客户端的连接总数量。 Requests:客户端发送的请求数量。 Reading:当前服务器正在读取客户端请求头的数量。 Writing:当前服务器正在写响应信息的数量。 Waiting:当前多少客户端在等待服务器的响应。
|
用户如果反复访问服务器的相同文件可以缓存到客户机,避免服务器反复传送相同文件,节约时间
1 2 3 4 5 6 7
| 打开配置文件,在默认的location下面添加一个location location ~* \.(jpg|html|txt|mp3)$ { //当发现用户访问的是 以.jpg或者.html等等结尾的页面时 expires 30d; //就把上述访问的文件在客户机缓存30天 } sbin/nginx -s reload //配置完后重加载配置文件 //使用火狐浏览器清空历史记录,然后访问192.168.99.5/a.html然后地址栏输入about:cache查看disk文件的列表,找到被访问文件看最后倒数第2列(Expires)信息显示多久过期可以看到该文件的过期时间是一个月之后,说明缓存成功。
|
1 2 3 4 5 6
| //默认情况下nginx无法支持长地址栏,会报414错误 //打开配置文件,在默认的虚拟主机上方添加两行 client_header_buffer_size 200k; //第一行表示,用户访问网站的头部信息(包含地址栏)长度支持200k大小 large_client_header_buffers 4 200k; //第二行表示,如果200k不够,再给4个200k
sbin/nginx -s reload //重加载配置
|
1.安装使用阿帕奇自带网站压力测试工具
1 2
| [root@web1 ~]# yum -y install httpd-tools ab -c 200 -n 200 http://192.168.99.5/ //用压力测试工具模拟200人,每人1次,一共200次对99.5的网站发起访问,成功
|
2.设置nginx访问量
1 2 3
| 打开nginx配置文件修改第3行,第13行 worker_processes 2; //开启的nginx进程数量,通常是随cpu的核心数一致 worker_connections 50000; //每个nginx进程支持的并发访问量
|
3.查看设置系统文件访问次数
1 2 3 4 5 6
| ulimit -n //查询系统打开文件数量的大小 ulimit -n 100000 //临时定义文件可以同时被打开的次数为10万 vim /etc/security/limits.conf //打开配置文件实现永久修改 修改第53、54行 * soft nofile 100000 * hard nofile 100000
|
在一个集群中,如果网站需要用户输入用户名和密码登陆之后才能继续访问,那么当用户登陆其中一台集群主机之后随着继续访问页面,请求可能被代理服务器轮询到另外一台服务器上,那么对于另外一台服务器来说用户并没有登陆,想查看登陆之后的页面还需要再次登陆,这样集群主机越多需要客户重复登陆的次数就越多
为了统一session存储的位置(该存储方式通常被称为session共享),需要安装专门的数据库工具
memcache 可以利用内存读写数据的数据库服务
1 2 3 4 5 6 7 8 9 10 11
| 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 abc 0 200 3 //添加abc变量,如果abc已经存在则会添加失败 flush_all //删除所有数据 quit //退出
|
修改存储session文件的位置
1 2 3 4 5 6 7 8
| vim /etc/php-fpm.d/www.conf //到最后一页 php_value[session.save_handler] = memcache //这里改成memcache,表示session 的存储不在是本地的普通文件,而是去找memcache php_value[session.save_path] = tcp://192.168.99.5:11211 //这里的路径修改为 安装了memcache服务的服务器地址与端口
yum -y install php-pecl-memcache //安装php与memcached服务关联的软件包 systemctl restart php-fpm
|
编写Unit文件,使systemctl命令控制nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cd /usr/lib/systemd/system cp httpd.service nginx.service //拷贝模板 vim nginx.service //修改 [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是发送退出信号,使nginx优雅关闭(处理完客户请求才退出),$MAINPID是变量,里面存了nginx的进程号
[Install] WantedBy=multi-user.target //支持开机自启
1. systemctl daemon-reload //激活刚才的test.service文件,但有时可能不好使,可以重启系统 然后重启服务之后可以用systemctl等命令控制nginx 提示:必须要提前先安装好nginx服务,并且没有其他服务占用80端口!
|