入门

Docker安装

拉取镜像

  1. $ docker pull nginx:latest

查看本地镜像:

  1. $ docker images

image.png

运行容器

  1. $ docker run --name nginx-test -p 8080:80 -d nginx

参数说明:

  • —name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行。

    安装成功

    最后我们可以通过浏览器可以直接访问 8080 端口的 nginx 服务:
    image.png

部署项目

挂载

我们可以看到的是我们每次修改nginx的配置文件需要复制出来,修改,然后复制回去。这样来说甚是麻烦。
我们可以通过挂载的方式来解决来回cp的问题。
我们把前面创建的nginx-test的default.conf放到一个文件夹里面。
比如:我们把default.conf 存放在~/home/nginx/default.conf
image.png
然后我们启动:(需要删除前面创建的容器,或者name跟前面的不一样也行)

  1. $ docker run -d -p 8080:80 -v ~/home/nginx/default.conf:/etc/nginx/conf.d/default.conf --name nginx-test nginx

说明:

  • -v 创建一个挂载, ~/home/nginx/default.conf:/etc/nginx/conf.d/default.conf 前面是宿主机的路径 后面的 是容器中的路径。

我们的default.conf配置文件是放在容器外部的,default.conf文件内容如下所示。

  1. server {
  2. listen 80;
  3. listen [::]:80;
  4. server_name localhost;
  5. #access_log /var/log/nginx/host.access.log main;
  6. location / {
  7. root /usr/share/nginx/html;
  8. index index.html index.htm;
  9. }
  10. #error_page 404 /404.html;
  11. # redirect server error pages to the static page /50x.html
  12. #
  13. error_page 500 502 503 504 /50x.html;
  14. location = /50x.html {
  15. root /usr/share/nginx/html;
  16. }
  17. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  18. #
  19. #location ~ \.php$ {
  20. # proxy_pass http://127.0.0.1;
  21. #}
  22. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  23. #
  24. #location ~ \.php$ {
  25. # root html;
  26. # fastcgi_pass 127.0.0.1:9000;
  27. # fastcgi_index index.php;
  28. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  29. # include fastcgi_params;
  30. #}
  31. # deny access to .htaccess files, if Apache's document root
  32. # concurs with nginx's one
  33. #
  34. #location ~ /\.ht {
  35. # deny all;
  36. #}
  37. }

添加静态文件index.html

在home文件下新建index.html文件。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <link rel="icon" href="/favicon.ico" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>简历</title>
  8. </head>
  9. <body>
  10. <h1>hello nginx -刘正星</h1>
  11. </body>
  12. </html>

我们想,如果我们将我们的静态文件夹存放在宿主机上,然后做一个挂载放在容器里这个路径,那么我们是不是修改宿主机上面的 静态文件,对应的容器的静态文件也会进行修改。
这个就是实现了我们前端页面用nginx显示的需求吗。
image.png
运行如下命令:

  1. $ docker run -d -p 8080:80 -v ~/home/nginx/default.conf:/etc/nginx/conf.d/default.conf -v ~/home:/usr/share/nginx/html --name nginx-test nginx

image.png
image.png

通过浏览器访问测试一下。
image.png

参考文章: https://blog.csdn.net/datouniao1/article/details/106442387 同一台机器多项目部署 https://zhuanlan.zhihu.com/p/69555541

问题

单页应用页面刷新404问题

原因

原因是因为web单页面开发模式,只有一个index.html入口,其他路径是前端路由去跳转的,nginx没有对应这个路径,当然就是404了。

解决方案

  1. location / {
  2. root /usr/nginx/app/dist/;
  3. index index.html;
  4. try_files $uri $uri/ /index.html;
  5. }

总结

在配置中加上try_files,意思跟翻译差不多,“尝试读取文件”。u r i 这 个 是 n g i n x 的 一 个 变 量 , 存 放 着 用 户 访 问 的 地 址 , 例 如 h t t p : / / l o c a l h o s t : 8200 / c h o o s e S i z e 那 么 uri 这个是nginx的一个变量,存放着用户访问的地址,例如http://localhost:8200/chooseSize 那么uri这个是nginx的一个变量,存放着用户访问的地址,例如http://localhost:8200/chooseSize那么uri就是/chooseSize;u r i / 代 表 访 问 的 是 一 个 目 录 例 如 h t t p : / / l o c a l h o s t : 8200 / c h o o s e S i z e / 那 么 uri/ 代表访问的是一个目录 例如http://localhost:8200/chooseSize/ 那么uri/代表访问的是一个目录例如http://localhost:8200/chooseSize/那么uri/就是/chooseSize/;最后/index.html就是我们首页的地址。
最终上面的意思是如果第一个存在,直接返回;不存在的话读取第二个,如果存在,读取返回;如果还是不存在,就会fall back到 try_files 的最后一个选项 /index.html,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求http://localhost:8200/index.html,再通过前端路由到/chooseSize
[

](https://zhuanlan.zhihu.com/p/69555541)

Nginx配置详解

nginx配置

image.png

普通安装

参考:https://www.runoob.com/linux/nginx-install-setup.html

常用命令

  1. /usr/local/webserver/nginx/sbin/nginx # 启动
  2. /usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
  3. /usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
  4. /usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
  5. /usr/local/webserver/nginx/sbin/nginx -t # 检查配置文件nginx.conf的正确性
  6. /usr/local/webserver/nginx/sbin/nginx -v # 查看nginx版本

Nginx同一个server部署多个静态资源目录

一般情况,有时候业务需求,需要在一个server下面不同目录部署两个不同的项目。
比如 http://domain:port/admin 匹配的是 admin 项目
比如 http://domain:port/react 匹配的是 react 项目

我们在nginx.conf里面写一个新的server;

  1. server {
  2. listen 6002;
  3. server_name **.**.**.**;
  4. gzip on;
  5. location /admin {
  6. alias /projects/admin/;
  7. #指定主页
  8. index index.html;
  9. #自动跳转
  10. autoindex on;
  11. }
  12. location /react {
  13. alias /projects/react/;
  14. #指定主页
  15. index index.html;
  16. #自动跳转
  17. autoindex on;
  18. }
  19. }


复制代码然后关闭 nginx

  1. [root]# nginx -s stop


复制代码重启 nginx

  1. [root]# nginx -c /etc/nginx/nginx.conf


复制代码总结:
这里需要注意的就是location中的路径匹配问题,rootalias的区别;

错误写法,会报404

  1. # 错误写法,会报404
  2. location /admin {
  3. root /projects/admin/;
  4. #指定主页
  5. index index.html;
  6. #自动跳转
  7. autoindex on;
  8. }
  9. location /react {
  10. root /projects/react/;
  11. #指定主页
  12. index index.html;
  13. #自动跳转
  14. autoindex on;
  15. }
  16. # 当你访问 http://***/admin
  17. # root ==> 实际指向的是 http://***/admin/projects/admin/, 这个时候肯定找不到index.html
  18. # alias ==> 实际指向的是 http://***/admin, 可以在/projects/admin/找到index.html

jsnu
default.conf

  1. # For more information on configuration, see:
  2. # * Official English Documentation: http://nginx.org/en/docs/
  3. # * Official Russian Documentation: http://nginx.org/ru/docs/
  4. user nginx;
  5. worker_processes auto;
  6. error_log /var/log/nginx/error.log;
  7. pid /run/nginx.pid;
  8. # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  9. include /usr/share/nginx/modules/*.conf;
  10. events {
  11. worker_connections 1024;
  12. }
  13. http {
  14. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. '$status $body_bytes_sent "$http_referer" '
  16. '"$http_user_agent" "$http_x_forwarded_for"';
  17. access_log /var/log/nginx/access.log main;
  18. sendfile on;
  19. tcp_nopush on;
  20. tcp_nodelay on;
  21. keepalive_timeout 65;
  22. types_hash_max_size 2048;
  23. include /etc/nginx/mime.types;
  24. default_type application/octet-stream;
  25. # Load modular configuration files from the /etc/nginx/conf.d directory.
  26. # See http://nginx.org/en/docs/ngx_core_module.html#include
  27. # for more information.
  28. include /etc/nginx/conf.d/*.conf;
  29. server {
  30. listen 80;
  31. listen [::]:80;
  32. server_name localhost;
  33. #access_log /var/log/nginx/host.access.log main;
  34. location / {
  35. root /usr/share/nginx/html;
  36. index index.html index.htm;
  37. try_files $uri $uri/ /index.html;
  38. }
  39. #error_page 404 /404.html;
  40. # redirect server error pages to the static page /50x.html
  41. #
  42. error_page 500 502 503 504 /50x.html;
  43. location = /50x.html {
  44. root /usr/share/nginx/html;
  45. }
  46. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  47. #
  48. #location ~ \.php$ {
  49. # proxy_pass http://127.0.0.1;
  50. #}
  51. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  52. #
  53. #location ~ \.php$ {
  54. # root html;
  55. # fastcgi_pass 127.0.0.1:9000;
  56. # fastcgi_index index.php;
  57. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  58. # include fastcgi_params;
  59. #}
  60. # deny access to .htaccess files, if Apache's document root
  61. # concurs with nginx's one
  62. #
  63. #location ~ /\.ht {
  64. # deny all;
  65. #}
  66. }
  67. # Settings for a TLS enabled server.
  68. #
  69. # server {
  70. # listen 443 ssl http2 default_server;
  71. # listen [::]:443 ssl http2 default_server;
  72. # server_name _;
  73. # root /usr/share/nginx/html;
  74. #
  75. # ssl_certificate "/etc/pki/nginx/server.crt";
  76. # ssl_certificate_key "/etc/pki/nginx/private/server.key";
  77. # ssl_session_cache shared:SSL:1m;
  78. # ssl_session_timeout 10m;
  79. # ssl_ciphers PROFILE=SYSTEM;
  80. # ssl_prefer_server_ciphers on;
  81. #
  82. # # Load configuration files for the default server block.
  83. # include /etc/nginx/default.d/*.conf;
  84. #
  85. # location / {
  86. # }
  87. #
  88. # error_page 404 /404.html;
  89. # location = /40x.html {
  90. # }
  91. #
  92. # error_page 500 502 503 504 /50x.html;
  93. # location = /50x.html {
  94. # }
  95. # }
  96. }

代理规则

  1. location /api/ {
  2. proxy_pass http://49.234.54.97:8088; #项目启动地址
  3. }

实际请求 http://49.234.54.97:8088/api/xxx

  1. location /api/ {
  2. proxy_pass http://49.234.54.97:8088/; #项目启动地址
  3. }

实际请求 http://49.234.54.97:8088/xxx

nginx——尚硅谷

最小配置

worker_processes

worker_processes 1; 默认为1,表示开启一个业务进程

worker_connections

worker_connections 1024; 单个业务进程可接受连接数

include mime.types;

include mime.types; 引入http mime类型

default_type application/octet-stream;

default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。

sendfile on;

sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfile
image.png
开启:
image.png##

keepalive_timeout 65;

keepalive_timeout 65;

server

image.png
虚拟主机配置

  1. server {
  2. listen 80; #监听端口号
  3. server_name localhost; #主机名
  4. location / { #匹配路径
  5. root html; #文件根目录
  6. index index.html index.htm; #默认页名称
  7. }
  8. error_page 500 502 503 504 /50x.html; #报错编码对应页面
  9. location = /50x.html {
  10. root html;
  11. }
  12. }

简版配置

  1. worker_processes auto;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. sendfile on;
  7. keepalive_timeout 65;
  8. include /etc/nginx/mime.types;
  9. default_type application/octet-stream;
  10. #虚拟主机vhost
  11. server {
  12. listen 80; #监听端口号
  13. server_name localhost;#主机名
  14. location / { #匹配路径
  15. root html; #文件根目录
  16. index index.html index.htm; #默认页名称
  17. }
  18. error_page 500 502 503 504 /50x.html; #报错编码对应页面
  19. location = /50x.html {
  20. root html;
  21. }
  22. }
  23. }