欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx详解

程序员文章站 2024-01-26 22:54:34
...

1.什么是nginx?

  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,*使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名

2.nginx与apache的异同?

  • Nginx
    (1)轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
    (2)抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
    (3) nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
    (4)nginx 的设计高度模块化,编写模块相对简单
    (5)nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
    (6)nginx 作为负载均衡服务器,支持 7 层负载均衡;nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
    (7)启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级, 社区活跃,各种高性能模块出品迅速

  • Apache
    (1) apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
    (2)apache 发展到现在,模块超多,基本想到的都可以找到
    (3)apache 更为成熟,少 bug ,nginx 的 bug 相对较多
    (4)apache 超稳定,apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
    (5)apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
    (6)apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。

总结

两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程

一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配置项多。
转载

3.nginx目录详解

当解压nginx安装包后会生成,nginx相应目录:

nginx详解

(1)auto 目录中:
cc目录:编译,os目录:判断操作系统类型,lib和type目录:存放库文件,辅助编译
(2)CHANGES 跟以前版本的对比
(3)CHANGES.ru  俄罗斯版本的changes (作者是俄罗斯的)
(4)conf  存放配置文件,会copy到编译好的配置文件中
(5)configure  编译完的运行脚本
(6)contrib  提供语法检测的字体
(7)html  默认发布目录,存放默认的正确的和错误的访问页面
(8)LICENSE   版权声明
(9)man  帮助文档
(10)README  手册,指定了官网网址
(11)src  源码目录 里面都是源码的东西

4.nginx的配置文件结构框架

nginx详解
 
(1)main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
(2)events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
(3)http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
(4)server块:配置虚拟主机的相关参数,一个http中可以有多个server。
(5)location块:配置请求的路由,以及各种页面的处理情况。

5.nginx的配置文件参数详解

#1.定义Nginx运行的用户和用户组为nginx,指的是worker的工作控制组是nginx用户,是为了保证系统的安全性。新建nginx用户及用户组
user  nginx nginx;

nginx详解
nginx详解


#2.进程数,即处理请求的进程(熟称负责接客的服务员),服务中的进程数应该与实际硬件相匹配;初始可设置为cpu总核数如:worker_processes 8;
worker_processes  8;

nginx详解

#3.全局错误日志定义类型
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#4.把进程号记录到文件,用于管理nginx进程
#pid        logs/nginx.pid;
#5.Nginx的事件模型中的最大打开文件数,可设置为系统优化后的ulimit-HSn的结果,
即1024可改为65535,然后在/etc/security/limits.conf文件中修改,因为该文中是默认的nginx的连接数,
只需在该文件中修改即可
events {
    worker_connections  1024;      #nginx的最大连接数=worker连接数*worker进程数
}

#6.http模块的设置部分
http {
    include       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;    #开启高效文件传输模式,实现内核零copy
    #tcp_nopush     on;       #**tcp_nopush参数可以允许把httpresponseheader和文件的开始放在一个文件里面发布,减少网络报文段的数量

    #keepalive_timeout  0;   #连接超时时间,单位是秒
    keepalive_timeout  65;

    #gzip  on;    #gzip压缩,对于网站优化极其重要

#7.设置基于域名的虚拟主机部分
    server {
        listen       80;    #监听的端口,也可以是172.25.254.1:80形式
        server_name  localhost;   #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {      #默认访问的location标签段
            root   html;   #站点根目录,即网站程序存放的目录
            index  index.html index.htm;      #首页排序
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
       #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {     #符合php扩展名的请求调度到fcgi server
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;     #抛给本机的9000端口(php fastcgi server)
        #    fastcgi_index  index.php;    #设定动态首页
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;     #设定和fastcgi交互的参数包含文件
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

#8.http虚拟主机
    # HTTPS server
    #
    #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   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx版本号的隐藏

vim /root/nginx/nginx-1.15.9/src/core/nginx.h  ##修改相应配置文件

nginx详解