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; #域名,默认的虚拟主机改成www.a.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、准备动态网站页面的测试文件

  • 拷贝动态网站到html目录

  • 修改Nginx配置文件,默认为注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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; //这里是另外一个配置文件,需要改扩展名
    }
  • 启Nginx服务或重新加载配置文件

  • 拷贝数据库文件到html目录,进入数据库创建测试账户

  • 在网站看到测试页面和数据库页面,不但能识别静态网站也能解析动态,实现了动静分离

地址重写

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; #访问老网站会跳到新网站,同时会携带所访问的页面,()是正则,代表保留(复制) $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、调节权重定义集群主机任务的分配量
1
2
server 192.168.99.200:80 weight=2;   //为性能较强的集群主机配置权重
,权重越大任务的分配量就越大
  • 2、配置健康检查
1
2
server 192.168.99.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败,则认为集群中的主机故障,之后等待30秒再次测试
//输入sbin/nginx -s reload重置配置文件
  • 3、相同客户机访问相同服务器
1
2
3
4
5
upstream web {
ip_hash; //相同客户机访问相同服务器,让一个客户机访问集群时锁定一个后台服务器,避免重复登陆的问题
server 192.168.99.100:80;
server 192.168.99.200:80;
}
  • 4、添加down标记
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问题处理

  • 404报错页面图片替换
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 //重加载配置
  • 优化nginx并发

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端口!
更新于

请我喝[茶]~( ̄▽ ̄)~*

Chen 微信支付

微信支付

Chen 支付宝

支付宝

Chen 贝宝

贝宝