Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器。 Nginx 是由 Igor Sysoev(伊戈尔·塞索耶夫)为俄罗斯访问量第二的 rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx能够选择高效的epoll(Linux2.6内核)作为网络I/O)模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达5000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。

常见web架构:

LAMP =Linux+Apache+Mysql+PHP
LNMP =Linux+Nginx+Mysql+PHP

nginx的官方网站:

http://nginx.org/en/download.html

Nginx的版本特性

Mainline version 主线版本
Stable version 稳定版本
Legacy versions 遗产版本 /历史版本
版本命名的常识:偶数为稳定,奇数是测试版或开发版本

Tengine概述

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
官方网站:http://tengine.taobao.org/

Nginx和Apache的区别:
nginx或apache 服务器本身可以解析php文件吗? 可以:1 不可以:2
apache和nginx在处理php代码时有什么区别?

1:Nginx是通过php-fpm这个服务来处理php文件
2:Apache是通过libphp5.so这个模块来处理php文件

Nginx:
Nginx.png

Apache:
Apache.png
总结:
Apache的libphp5.so随着apache服务器一起运行,而Nginx和php-fpm是各自独立运行,所以在运行过程中,Nginx和php-fpm都需要分别启动!

nginx相对于apache的优点:

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源 ;高并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;高度模块化的设计,编写模块相对简单;社区活跃,各种高性能模块出品迅速。

apache 相对于nginx 的优点:

  • apache 超稳定 ,一般来说,需要并发性高的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 。
  • nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。

在Nginx上配置多个站点

Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

Nginx配置文件示例1

  1. #配置用户或者组,默认为nobody nobody。
  2. user nginx;
  3. #允许生成的进程数,默认为1
  4. worker_processes 1;
  5. #制定日志路径,级别。这个设置可以放入全局块,http块,server块
  6. #级别以此为:debug|info|notice|warn|error|crit|alert|emerg
  7. error_log /var/log/nginx/error.log warn;
  8. #指定nginx进程运行文件存放地址
  9. pid /var/run/nginx.pid;
  10. events {
  11. accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
  12. multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
  13. #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
  14. worker_connections 1024; #最大连接数,默认为512
  15. }
  16. http {
  17. #文件扩展名与文件类型映射表(js、css解析失败)
  18. include /etc/nginx/mime.types;
  19. #include /etc/nginx/conf.d/*.conf;
  20. #默认文件类型,默认为text/plain
  21. default_type application/octet-stream;
  22. #access_log off; #取消访问 服务日志
  23. #指定日志格式
  24. #1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  25. #2.$remote_user :用来记录客户端用户名称;
  26. #3.$time_local : 用来记录访问时间与时区;
  27. #4.$request : 用来记录请求的url与http协议;
  28. #5.$status : 用来记录请求状态;成功是200;
  29. #6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  30. #7.$http_referer :用来记录从那个页面链接访问过来的;
  31. #8.$http_user_agent :记录客户端浏览器的相关信息;
  32. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  33. '$status $body_bytes_sent "$http_referer" '
  34. '"$http_user_agent" "$http_x_forwarded_for"';
  35. #off取消访问 服务日志,日志位置及级别
  36. access_log /var/log/nginx/access.log main;
  37. #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
  38. sendfile on;
  39. sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
  40. keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
  41. #在连接套接字时启用TCP_CORK,默认禁用
  42. #tcp_nopush off;
  43. keepalive_requests 120; #单连接请求上限次数。
  44. #gzip on;
  45. upstream net {
  46. server www.gaozhaoxi.com:11000;
  47. #server www.gaozhaoxi.com:11001;backup; #热备
  48. }
  49. error_page 404 http://www.gaozhaoxi.com:11000; #404错误页
  50. server {
  51. listen 80; #监听端口
  52. server_name gaox.site; #监听地址
  53. #请求的url过滤,正则匹配, ~*^.+$ ~为区分大小写,~*为不区分大小写。
  54. location / {
  55. keepalive_requests 120; #单连接请求上限次数。
  56. #注意这里尾部追加/的目的,当做虚路径;在实际转发时隐藏掉location中配置的路径
  57. #如果不加/的话,对应的服务的跟路径是net/加上上location后的路径
  58. proxy_pass http://net/; #请求转向net 定义的服务器列表
  59. proxy_redirect off;
  60. proxy_set_header Host $host;
  61. proxy_set_header X-Real-IP $remote_addr;
  62. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  63. proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length;
  64. proxy_set_header X-Forwarded-Proto $scheme;
  65. #deny 59.32.68.152; #拒绝的ip
  66. #allow 172.18.25.30; #允许的ip
  67. }
  68. }
  69. }

Nginx配置文件示例2

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. # '$status $body_bytes_sent "$http_referer" '
  15. # '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. upstream gaoxnet {
  23. server www.gaozhaoxi.com:11000;
  24. }
  25. server {
  26. listen 80;
  27. server_name localhost;
  28. #charset koi8-r;
  29. #access_log logs/host.access.log main;
  30. location /iot/ {
  31. proxy_pass http://gaoxnet/;
  32. proxy_redirect off;
  33. proxy_set_header Host $host;
  34. proxy_set_header X-Real-IP $remote_addr;
  35. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  36. proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length;
  37. proxy_set_header X-Forwarded-Proto $scheme;
  38. }
  39. location /static/ {
  40. alias static/;
  41. index index.html index.htm;
  42. autoindex on; #开启浏览目录权限,默认是off;
  43. }
  44. location / {
  45. root html;
  46. index index.html index.htm;
  47. }
  48. #error_page 404 /404.html;
  49. # redirect server error pages to the static page /50x.html
  50. #
  51. error_page 500 502 503 504 /50x.html;
  52. location = /50x.html {
  53. root html;
  54. }
  55. #location /iot.*$ {
  56. # proxy_pass http://gaoxnet/;
  57. #}
  58. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  59. #
  60. #location ~ \.php$ {
  61. # proxy_pass http://127.0.0.1;
  62. #}
  63. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  64. #
  65. #location ~ \.php$ {
  66. # root html;
  67. # fastcgi_pass 127.0.0.1:9000;
  68. # fastcgi_index index.php;
  69. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  70. # include fastcgi_params;
  71. #}
  72. # deny access to .htaccess files, if Apache's document root
  73. # concurs with nginx's one
  74. #
  75. #location ~ /\.ht {
  76. # deny all;
  77. #}
  78. }
  79. # another virtual host using mix of IP-, name-, and port-based configuration
  80. #
  81. server {
  82. listen 8000;
  83. # listen somename:8080;
  84. server_name localhost;
  85. location ~*^.+$ {
  86. proxy_pass http://gaoxnet;
  87. #index index.html index.htm;
  88. }
  89. }
  90. # HTTPS server
  91. #
  92. #server {
  93. # listen 443 ssl;
  94. # server_name localhost;
  95. # ssl_certificate cert.pem;
  96. # ssl_certificate_key cert.key;
  97. # ssl_session_cache shared:SSL:1m;
  98. # ssl_session_timeout 5m;
  99. # ssl_ciphers HIGH:!aNULL:!MD5;
  100. # ssl_prefer_server_ciphers on;
  101. # location / {
  102. # root html;
  103. # index index.html index.htm;
  104. # }
  105. #}
  106. }

示例3

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. # 这里需要改成你本地的前端代码目录
  5. root /home/ubuntu/workspace/nicefish-angular/;
  6. index index.html;
  7. location / {
  8. try_files $uri $uri/ /index.html;
  9. }
  10. location /nicefish {
  11. add_header From nicefish;
  12. proxy_pass http://localhost:8080/nicefish;
  13. proxy_set_header X-Forwarded-Proto $scheme;
  14. proxy_set_header X-Forwarded-Port $server_port;
  15. proxy_set_header Remote_Addr $remote_addr;
  16. proxy_set_header Host $host;
  17. proxy_set_header X-Real-IP $remote_addr;
  18. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  19. proxy_set_header Cookie $http_cookie;
  20. proxy_redirect default;
  21. proxy_buffering off;
  22. proxy_cookie_path ~*^/.* /;
  23. proxy_intercept_errors on;
  24. }
  25. location ~ \.(html|js|css|png|jpg|jpeg|gif|ico|json|woff2|eot|ttf|svg|woff)$ {
  26. # 这里需要改成你本地的前端代码目录
  27. root /home/ubuntu/workspace/nicefish-angular/;
  28. }
  29. }

示例四

反向代理tcp socket连接。

  1. stream {
  2. upstream bitbucket-ssh{
  3. server 192.168.1.187:4305;
  4. }
  5. server {
  6. listen 80;
  7. proxy_timeout 60s;
  8. proxy_pass 192.168.1.187:4305;
  9. }
  10. }

Nginx小问题

Nginx服务器导致CSS无法解析不起效果

html,js正常加载,css也没有报404,css能够正常获取,只是浏览器无法解析,研究了一下发现,原来是配置Nginx的时候将/etc/nginx/nginx.conf的一行include /etc/nginx/mime.types; 误删了,导致了Nginx无法正确识别CSS文件,因此向浏览器发送了错误的MIME类型。加上那行,然后重启Nginx服务进行就好了。

  1. include /etc/nginx/mime.types;
  2. # 或者
  3. include mime.types;

Nginx安全

查看Nginx版本

  1. curl -i iot.gaox.site
  2. curl -i www.baidu.com

这样就可以看到Nginx服务器的版本号等信息,,,

  1. [root@gaox admin]# curl -i iot.gaox.site
  2. HTTP/1.1 200
  3. Server: nginx/1.17.1
  4. Date: Tue, 27 Aug 2019 10:49:13 GMT
  5. Content-Type: text/html;charset=UTF-8
  6. Content-Length: 7909
  7. Connection: keep-alive
  8. Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
  9. Last-Modified: Thu, 25 Jul 2019 13:28:53 GMT
  10. Accept-Ranges: bytes
  11. Content-Language: en-US
  12. <!DOCTYPE html>
  13. <html lang="zh-cn" xmlns:th="http://www.thymeleaf.org">
  14. <head>
  15. ...

其他

Nginx修改access.log日志时间格式