Nginx 运行机制
Nginx 同 Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
apache 被设计为一个重量级的,它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。
安装与编译
安装nginx需要安装 GCC ,gcc是编译的基础
然后安装 nginx的扩展 pcre:nginx正则表达库;zlib:提供数据压缩用的函式库;openssl:提供加密方法
然后安装nginx时编译进去:
注意 前四个prefix,sbin,conf,pid的路径是nginx编译后的运行文件的位置
注意 with 后跟几个库的源码路径,在同一文件夹下注意写相对路径
sudo ./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.0.2
有最新版本的扩展就安装最新版本的,老版本可能会出现意想不到的错误
可能会出现很多问题,有可能是没有使用管理员权限 sudo,有可能文件没有读写权限 chomd - R 777 文件名,有可能需要解压 tar -zxvf 压缩包名,移动文件 mv 文件 路径 ,卸载重装 rm -rf 文件名
具体安装参考网址:
https://www.zybuluo.com/phper/note/73025
https://blog.youkuaiyun.com/cnwyt/article/details/79161387
https://www.cnblogs.com/wyd168/p/6636529.html
启动和配置
找到刚刚编译时写的安装路径,我们首先需要确定nginx监听的端口没有被占用,如果被占用,如果之前安装过Apache, 它也是80端口,那么需要kill掉Apache,可以考虑更改监听窗口/usr/local/nginx/nginx.conf中36行 listen 为 8080或其他;编写时需要注意文件是否有读写权限,使用vim 文件名编写。a 进行插入,:wq 保存退出。
/usr/local/nginx/nginx
启动之后,浏览器访问http://localhost:端口号
nginx 平滑启动:/usr/local/nginx/nginx -s reload
查看nginx进程: ps -ef|grep nginx
nginx 并不解析php ,所以交给php-fpm解析,所以要确保php安装有php-fpm扩展
nginx解析php
1,进入查看nginx 编译安装后 nginx 的文件夹:
主要的有
nginx 启动文件 nginx
nginx配置文件 nginx.conf
fastcgi配置文件 fastcgi.conf
日志文件夹 log: 里面两个文件链接日志access.log 和错误日志 error.log
nginx默认的web 目录:html 文件夹
_temp 文件,一些执行的临时文件
2,进入查看nginx.conf 文件:
#user nobody; #用户名
worker_processes 1; #进程数,一般由cpu核心数决定
#开启错误日志等级
#error_log logs/error.log;
error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll; #nginx工作模式,select/poll为标准模式,epoll为高效模式
worker_connections 1024; #工作进程链接数
}
http {
include mime.types; #包含解析的文件类型在mime.types文件中
default_type application/octet-stream; #默认以二进制文件流形式
#日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#链接日志的位置和格式
access_log logs/access.log main;
sendfile on;
#tcp_nopush on; #是否开启网络拥塞
#连接超时时间设置
#keepalive_timeout 0;
keepalive_timeout 65;
server {
listen 8090; #监听的端口
server_name localhost; #别名
location / {
root html; # 网站根目录
index index.html index.htm index.php ; #允许访问的首页排序
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ { #符合php扩展名的请求调度到fcgi server
root html;
fastcgi_pass 127.0.0.1:9000; #抛给本机的9000端口
fastcgi_index index.php; #设定动态首页
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
# 负载均衡配置
upstream ytx.com{ #负载均衡名称
ip_hash; #调度算法
server 59.110.175.142; #服务器ip地址
server 39.106.217.71;
}
}
Nginx的负载均衡模块目前支持4种调度算法:
weight 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair。比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
(此部分参考文献:https://www.zybuluo.com/phper/note/89391)
3,我们修改nginx 的web 目录在 var/www 下
详细解析可参考 https://www.cnblogs.com/liang-wei/p/5849771.html
修改配置文件后,可能需要重新启动,平滑启动可能没有用(平滑启动有可能只杀生死了工作线程)
应查找nginx线程,并杀死 master 主线程,杀死worker工作线程,nginx会重启一个工作线程
查看并寻找线程 ps -ef|grep nginx
baimayou 8879 1737 0 12:51 ? 00:00:00 nginx: master process /usr/local/nginx/nginx
baimayou 12614 8879 0 15:53 ? 00:00:00 nginx: worker process
baimayou 12725 5748 0 15:55 pts/1 00:00:00 grep --color=auto nginx
查看占用端口的程序 ss -lntpd | grep :8090
tcp LISTEN 0 128 0.0.0.0:8090 0.0.0.0:* users:(("nginx",pid=12614,fd=6),("nginx",pid=8879,fd=6))
杀死线程 kill 线程pid
4,重启后若发现端口被占用,就查找端口被占用的程序,一般都是apache,杀掉进程再次重启即可
nginx与php交互
php 与 apache 或者 ngix 结合, 会用sapi 提供2种连接方法:mod_php和mod_fastcgi。mod_php 模式会将php模块安装到apache下面来运行,2者结合度较大。mod_fastcgi模式则是作为一个中间过程,apache接收用户请求后,就发送给fastcgi, 再连接php来完成访问。
fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。
PHP-CGI就是PHP实现的自带的FastCGI管理器
PHP-FPM 是一个PHP专用的fastcgi管理器,它克服了PHP-CGI的2个问题
php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
直接杀死php-cgi进程,php就不能运行了。
所以要想nginx运行php,php必须启动php-fpm。
sudo /usr/local/php/sbin/php-fpm