nginx多个网站同时部署到一台主机上

目标,多个php网站同时部署到一台主机上
nginx+php

安装php8.0

安装参考链接

sudo apt install php8.0 # 安装php8
sudo apt install php8.0-common php8.0-mysql php8.0-xml php8.0-xmlrpc php8.0-curl php8.0-gd php8.0-imagick php8.0-cli php8.0-dev php8.0-imap php8.0-mbstring php8.0-opcache php8.0-soap php8.0-zip php8.0-intl -y # 安装拓展,如果需要其他拓展,很显然是php8.0-拓展名 的格式

sudo apt install php8.0-fpm # nginx+php必须装!!

拓展:fpm是什么?

dns配置

@表示直接 cuger.top 无需二级域名
图床启用了cdn加速,因此暂停直接的解析,而是用cnmae解析到cdn
file
file
当多个子域名解析到同一主机时,主机上的nginx也需要对应配置一下,见下面的配置

我的一个参考nginx配置

部署了两个网站,用了3个虚拟配置
第一个监听80端口,301永久重定向到https,所有其他网站只需要这一个就够了 主机名 _ 表示对所有的匹配
第二个 cuger.top 博客 443
第三个 pic.cuger.top 图床 只开启了443
/etc/nginx/sites-available/default文件中

server {
    listen       80;
    server_name  _;
    return       301 https://$host$request_uri;
}

server {

    # SSL configuration
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name cuger.top;
    root /var/www/html/wordpress;
    index index.php;

    ssl_certificate /etc/apache2/cert/7662809_cuger.top_public.crt;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
    ssl_certificate_key /etc/apache2/cert/7662809_cuger.top.key; #需要将cert-file-name.key替换成已上传的证书私钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    location / {
    try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
    include fastcgi.conf;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
    }   

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        log_not_found off;
    }
}

server {

    # SSL configuration
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name pic.cuger.top;
    root /var/www/html/picbed/public;
    index index.php;

    ssl_certificate /etc/nginx/cert/1_pic.cuger.top_bundle.crt;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
    ssl_certificate_key /etc/nginx/cert/2_pic.cuger.top.key; #需要将cert-file-name.key替换成已上传的证书私钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;
    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php/php8.0-fpm.sock;
    }
}

nginx常用命令

nginx -t # 检查配置文件是否有错误
nginx -s reload # 重新加载配置文件

nginx中try_files的的作用

当用户请求 http://localhost/example 时,这里的 $uri 就是 /example。
try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example(其中 $root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。
显然,目录中没有叫 example 的文件。然后就看 $uri/,增加了一个 /,也就是看有没有名为 /$root/example/ 的目录。
又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php
这个请求会被 location ~ .*.(php|php5)?$ { … } catch 住,也就是进入 FastCGI 的处理程序。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 PHP 程序的,因此不受 URI 变化的影响。

修改PHP的最大上传限制

默认情况下PHP上传文件大小限制是2M,超过2M上传将会报错。
PHP组件目录下的PHP.ini文件,使用记事本打开,查找 post_max_size(允许POST数据大小) 值修改成10M或更大,查找 upload_max_filesize(允许上传文件大小)

还需要注意memory_limit(PHP运行内存大小限制)尽量修改成比上述两值更大的容量。

另外我们还建议修改一下max_execution_time(脚本执行时间),来确保有足够的时间来完成大文件的上传,默认是30秒。