Nginx - 运维基本使用

目录

  • Nginx
    • 一、源码包安装
      • 1、原理
      • 2、特点
      • 3、正式安装
      • 4、nginx基础命令
      • 5、netstat、ss 命令
      • 6、版本平滑升级
    • 二、设置用户访问时密码认证
      • 1、修改配置文件
      • 2、生成密码文件
    • 三、设置https加密网站
      • 1、生成私钥与证书
      • 2、修改nginx配置,调用证书
    • 四、设置虚拟主机
      • 原理
    • 五、地址重写
      • 1、格式
      • 2、正则的使用
      • 3、实际案例
    • 六、"动静"分离
      • 1、原理
      • 2、正则的使用
      • 3、动静分离
      • 4、扩展
    • 七、Nginx的优化
      • 1、自定义报错页面
        • 知识扩展
        • 常见HTTP状态码
      • 2、查看服务器状态
        • 2.1、原理
        • 2.2、页面详情
        • 2.3、扩展
      • 3、优化并发量
        • 3.1、修改nginx配置
        • 3.2、修改Linux内核
      • 4、优化URL
        • 4.1、增加URL缓存
        • 4.2、测试脚本
      • 5、优化浏览器缓存
      • 6、优化服务器缓存
      • 7、对页面压缩
      • 8、日志切割
        • 8.1、旧日志重命名
        • 8.2、生成新日志
        • 8.3、脚本+计划任务

Nginx


一、源码包安装

1、原理

  • 源代码:即人写的代码,由各种语言形成,如shell、Python、JAVA、C语言等等。
  • 编译:用专门的编译器翻译成计算机语言(二进制)
  • 安装:将生成的计算机语言(二进制)放在指定路径中。

例:shell 脚本 ------------> bash 解释器(即:编译)-----------> 运行


2、特点

  • 可自定义安装路径

  • 自定义安装模块

    • ./configure -help #可以查看模块
    • 模块中–with-:可选择安装模块,默认不安装;–without-:为默认安装模块,如不需要则写上

3、正式安装

  • 首先安装依赖包pcre-devel、openssl-devel
  • pcre-devel:让Nginx支持正则; openssl-devel:让Nginx做加密网站
  • 同时为了安全。需要创建一个无法登录的用户,用于启动Nginx
    • 原因:如不指定用户启动,默认是以root启动(程度会继承root权限)
    • 其中涉及权限。参考附加权限set-uid,这个原理相当于该权限的反应用。
[root@proxy ~]# yum -y install gcc pcre-devel openssl-devel    //安装依赖包
[root@proxy ~]# useradd -s /sbin/nologin nginx
[root@proxy nginx-1.10.3]# ./configure   \
> --prefix=/usr/local/nginx   \                //指定安装路径
> --user=nginx   \                             //指定用户
> --group=nginx  \                             //指定组
> --with-http_ssl_module                       //开启SSL加密功能
[root@proxy nginx-1.10.3]# make && make install    //编译并安装

nginx在源码安装时,如果不指定用户,程序本身会强制自动降级成nobody用户,nobody是Linux默认用户。


4、nginx基础命令

  • nginx之所以比Apache牛逼:是因为底层支持事件型模型,内核支持事件型触发
[root@proxy ~]# /usr/local/nginx/sbin/nginx                    //启动服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop           //关闭服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload        //重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -V							//查看软件信息
[root@proxy ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/   //创建快捷方式,并放入PATH中,方便后期可直接使用nginx命令

5、netstat、ss 命令

  • 该命令可以查看系统中已启动的商品信息。
~]# netstat  -atunpl  |  grep nginx

-a:显示所有端口的信息
-n:以数字格式显示端口号
-t:显示TCP连接的端口
-u:显示UDP连接的端口
-l:显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p:显示监听端口的服务名称是什么(也就是程序名称)

~]# ss -atunpl | grep nginx		//显示信息更加详细。

6、版本平滑升级


操作步骤:

  1. 解包,编译
    • ./configure #此功能是把在source目录中默认常用的源码包模块选出来,再加上用户自定义安装的模块,放入新生成的目录objs中。
    • make #编译会生成一个可运行的主程度。就是将目录objs中的源码进行编译。
    • 注意,到make就可以了,无需再make install安装。
  2. 编译后在原目录下会生成一个新目录objs,里面有新的主程序nginx
  3. 备份老的主程序
  4. 将新的主程序移动到安装目录下
  5. 杀死旧进度,再启动nginx。命令:make upgrade
[root@proxy ~]# tar  -xf   nginx-1.12.2.tar.gz
[root@proxy ~]# cd  nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure   \
--prefix=/usr/local/nginx   \               # 指定安装路径
--user=nginx   \                            # 指定用户
--group=nginx  \                            # 指定组
--with-http_ssl_module                    	# 开启SSL加密功能

[root@proxy nginx-1.12.2]# make
[root@proxy ~]# mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.bak
[root@proxy ~]# cp objs/nginx  /usr/local/nginx/sbin/
[root@proxy ~]# make upgrade
或者:
]# killall nginx
]# /usr/local/nginx/sbin/nginx


二、设置用户访问时密码认证


1、修改配置文件

`在server{
     }中添加
server {
     
	auth_basic "input password:";										# 显示的提示信息
	auth_basic_user_file "/usr/local/nginx/pass";		# 指定密码文件
}

2、生成密码文件

  • 需要安装软件:httpd_tools。命令:htpasswd -c
[root@proxy ~]# yum -y install  httpd-tools
[root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom     //创建密码文件

#注意:-c :create创建。追加不使用此选项
[root@proxy ~]# htpasswd  /usr/local/nginx/pass jerry   //追加用户,不能再用-c选项


三、设置https加密网站


1、生成私钥与证书

  • 前提:需要安装依赖软件:openssl-devel
[root@proxy ~]# cd /usr/local/nginx/conf
[root@proxy ~]# openssl genrsa > cert.key				# 生成私钥
[root@proxy ~]# openssl req -new -x509 -key cert.key > cert.pem		# 生成证书
# -new 新建  -x509 证书格式

2、修改nginx配置,调用证书

  • 注意:在源码安装时需要添加模块:–with-http_ssl_module
  • 配置文件中本身已经有相关模板,只需要把注释打开即可。
[root@proxy ~]# vim  /usr/local/nginx/conf/nginx.conf
… …    
server {
     
        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;
            index  index.html index.htm;
        }
    }


四、设置虚拟主机


原理

  • 一个server{} 就是一个虚拟主机。
    • 在配置文件中添加 server{} 框架即可。
# 格式框架。必须在http{}中。

[root@proxy ~]# vim  /usr/local/nginx/conf/nginx.conf

http {
     
	server {
     
		listen 端口;
		server_name 域名;
		
		location / {
     
			root  网页根目录;				 					# 只填写相对路径即可。
			index  index.html index.php;		# 默认首页,匹配即止。
		}
	}
}


五、地址重写


1、格式

  • rewrite 旧地址 新地址 [选项];
    • last:不再读其他rewrite(类似于shell循环中的continue)
    • break 不再读其他语句,结束请求
    • redirect: 临时重定向(实际效果是:用户输入A,会显示成B)
    • permament:永久重定向

2、正则的使用

http{
     
	server {
     
		listen 80;
		server_name www.a.com;
		rewrite ^/(.*) http://www.tmooc.cn/$1;		# 这里的()是:保留,$1则是调用保留。

# 在server_name中已经标明了域名,在rewrite中旧地址中就可以省略前面的域名,只写后面的地址文件,或者用正则表示的文件。如:rewrite a.html b.html;rewrite ^/a b.html; 

		location / {
     
				rewrite ^/  http://www.tmocc.cn/;				# 跳转到首页。
		}
	}
}

# 在实际使用中,rewrite可以放在location{}里面,也可以在外面,但是都要在server{}里面。根据实际使用对象、场景进行设置。

3、实际案例

'在生活中,手机与电脑浏览同一个网站,同一个域名,但是需要调用的页面不一致。'

http {
     
	server {
     
		listen 80;
		server_name localhost;
		location / {
     
			root html;
			index index.html
		}
			if ($http_user_agent ~* firefox) {
     
			rewrite ^(.*)$  /firefox/$i;
			}
	}
}

# $http_user_agent 这是Nginx的一个内置变量,存储的信息是:客户端的操作系统和浏览器信息
# IE浏览器:$http_user_agent=msie;  火狐:$http_user_agent=Firefox


六、"动静"分离


1、原理

  • 一个location / {} 就是匹配一个或一类页面
  • 在Nginx配置文件中。server_name是用来匹配域名的。location是用来匹配域名后面的地址栏的。
  • 可以将location理解成:如果

2、正则的使用

  • 在使用正则时,需要在正则前加:~
location ~ /.* {
     xxxx}
location ~ /a.* {
     xxxx}
location ~ ^/abc$ {
     xxx}  =  location ~ ^abc$ {
     xxx}   
# location是用来匹配域名后面的。所以在正则应用中/是可以不写的。

location / {
     }   # 这个比较特殊。是匹配一切,但优先级最低。可放在任意位置,与位置无关。

3、动静分离

server {
     
	listen 80;
	server_name www.a.com;
	
	location / {
     								# "静"
		root html;
		index index.html;
	}
	
	location ~ /.php$ {
     							# "动"。所有匹配以.php结尾的请求则按此执行。
		root html;
		fastccgi_pass 127.0.0.1:9000;			# 转发给本机9000端口:php解释器
		fastcgi_index index.php;
		include  fastcgi.conf;					# 调用其它配置文件
	}
}

4、扩展

  • FastCGI:快速通用网关接口。多进程模式。Nginx结合FastCGI技术即可支持PHP页面架构

  • 查看日志小技巧:

    • tailf error.log:此命令打开的日志为动态日志。打开后按ENTER清空,然后再操作,则可显示实时的信息。
  • LNMP中的mysql是由PHP脚本连接mysql,一般由PHP开发人员负责写入脚本中,无需要运维人员写相应的脚本。

  • mysql -e [mysql的命令]:非交互式操作



七、Nginx的优化


1、自定义报错页面

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
        charset utf-8;                    # 仅需要中文时需要改选项,可选项
error_page   404  /404.html;   					  # 自定义错误页面
.. ..

知识扩展


  • utf-8:万国编码:是由苹果、IBM等几大公司联合,统一编码,包含全球主流语种。

  • 编码:将人类的语言与计算机语言(二进制)进行对应的码表。

  • 刚开始,只有一个ASCII码表,0~127(英文字母加常用符号)

  • 进入中国后,将中文进行编码:GB2312(国标2312)

常见HTTP状态码

状态码 功能描述
200 一切正常
301 永久重定向
302 临时重定向
401 用户名或密码错误
403 禁止访问(客户端 IP 地址被拒绝)
404 文件不存在
414 请求 URL 头部过长
500 服务器内部错误
502 Bad Gateway

2、查看服务器状态


2.1、原理

单独创建一个:location / {},进行指向一个单独的,由管理员才能登录的网页进行查看。

  • 背景:实际工作中经常需要关注重要参数:并发量,总访问量,等待人数。

  • 专门的模块:stub_status;在源码包安装时加装:–with-http_stub_status_module

[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
… …
location /status {
     										# status只是一个访问名称,自定义
                stub_status on;
                 #allow IP地址;
                 #deny 	IP地址;
        }
… …

2.2、页面详情

[root@proxy ~]# firefox http://192.168.4.5/status
Active connections: 1 								# 实时并发量
server accepts handled requests
 10 10 3 															
Reading: 0 Writing: 1 Waiting: 0

-------------------------------------------------------------------------------
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
(一般与accepts一致,除非服务器限制了连接数量)
Requests:客户端发送的请求数量.
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。

2.3、扩展

[root@proxy ~]# yum -y install http-tools				# 模拟并发量工具
[root@proxy ~]# ab -c 100 -n 100 http://192.168.4.5/

# -c:模拟人数;-n:总访问次数。   注意:http最后一定要以/结尾

3、优化并发量


3.1、修改nginx配置

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes  2;                # 与CPU核心数量一致

events {
     
	worker_connections 65535;        # 每个worker最大并发连接数
}
.. ..
-------------------------------------------------------------------------
worker_processes:nginx启动时的进程数,不能随便写,最多与CPU内核一致(用lscpu可查)
worker_connections:连接数,也是并发量。可大不可小。

# 了解:nginx实验室理论值最大并发量约5万。  65536:linux中最大的端口号。

3.2、修改Linux内核

  • Linux内核参数中。默认同时打开文件数为1024。

  • 因为客户访问nginx打开页面,就是打开对应的网页文件。

[root@proxy ~]# ulimit -a					//查看全部的内核参数。
......
open files      (-n)  1024				# 可打开的文件数。(-n)就是修改时要用的选项
.. ..
.. ..
------------------------------------------------------------------
[root@proxy ~]# ulimit -Hn 100000					//H:硬限制,不能超过
[root@proxy ~]# ulimit -Sn 100000					//S:软限制,可打破

#以上为临时设置,可立刻生效。在实际生产中,因为不能随意停机,应这样设置,但还需要设置永久配置。
--------------------------------------------------------------------
[root@proxy ~]# vim /etc/security/limits.conf
.. .. .. 
*              soft          nofile            100000
*              hard          nofile            100000

限制目标			  软、硬			  限制的项目(固定格式)			限制值
nofile=number of file


4、优化URL


4.1、增加URL缓存

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
     
	client_header_buffer_size    1k;        # 默认请求包头信息的缓存    
	large_client_header_buffers  4 4k;      # 大请求包头部信息的缓存个数与容量:4个4K
.. ..
}

# 案例中的设置在以后的工作环境中是足够的。在实验时,由于脚本产生的URL过大,可以设置稍大些。

4.2、测试脚本

[root@proxy ~]# cat lnmp_soft/buffer.sh 
#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {
     1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL                             # 经过5000次循环后,生成一个长的URL地址栏


5、优化浏览器缓存

  • 浏览器缓存:只缓存静态页面。因动态页面是脚本,如缓存会出错。
  • 虽然缓存是放在用户本地浏览器上的。但是缓存什么、缓存多久,是由服务器决定的。
  • 缓存时间:一般按公司资料的变更周期决定。
  • 原理:单独定义一个location / {}
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
     
        listen       80;
        server_name  localhost;
        location / {
     
            root   html;
            index  index.html index.htm;
        }
	location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
     		# 定义缓存哪些页面
				expires        30d;            									# 定义客户端缓存时间为30天
	}
}

6、优化服务器缓存

  • 原因:如果需要处理大量静态文件,可将文件缓存在内存中,提高读取速度。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http {
      
	open_file_cache   max=2000  inactive=20s;		# 最大缓存文件,关闭超时无访问
  open_file_cache_valid    60s;				# 缓存文件的有效时间。超过即清除
  open_file_cache_min_uses 5;					# 访问次数超过5次才被缓存
  open_file_cache_errors   off;				# 缓存报错不要写日志
} 

# 因为缓存是短时间性的。当有客户端访问时,无法访问到缓存数据就会报错,所以会有大量常规性报错,可无需理会。

7、对页面压缩

  • 开启压缩好处:省流量,速度更快。

  • 注意:一般只压缩文档类型的。不压缩多媒体文件(因为都比较大:如高清照片、电影等)

  • 所有的浏览器都是解压软件,都支持 gzip 解压

  • 压缩比率:0~9。==数字越小,速度越快,效果越差。==一般选中间的。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http {
     
.. ..
	gzip on;                           # 开启压缩
	gzip_min_length 1000;              # 小文件不压缩
	gzip_comp_level 4;                 # 压缩比率
	gzip_types text/plain text/css application/json application/x-javascript 		text/xml application/xml application/xml+rss text/javascript;
      # 对特定文件压缩,注意:这里的类型不能直接写txt,jpg等,需要参考mime.types
.. ..
}

[root@proxy ~]# cat /usr/local/nginx/conf/mine.types

8、日志切割


8.1、旧日志重命名

[root@proxy ~]# cd /usr/local/nginx/logs/
[root@proxy logs]# mv access.log  access-20190909.log

8.2、生成新日志

[root@proxy ~]# ls /usr/local/nginx/logs/
access.log    error.log    nginx.pid

[root@proxy logs]# kill -USR1 $(cat nginx.pid)				# 这里不是杀死进程,是生成新日志。

# 当nginx启动时,会生成一个nginx.pid的文件,里面存储的就是此时的进程号。

8.3、脚本+计划任务

[root@proxy ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)

[root@proxy ~]# crontab -e
03 03 * * 5  /usr/local/nginx/logbak.sh

你可能感兴趣的:(运维,nginx)