顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2018年5月15日 星期二

Synology Nginx 設置 Laravel Virtual Host

Laravel 建立的網站需要將所有的 uri 導向 index.php 的設置。

Synology 的 Web Station 本身就有設置  Virtual Host 的功能。
但可惜他 UI 介面缺少了加入自定義參數的功能,功能只做了一半。
後端伺服器如果採用 Apache,可以使用 .htaccess 來做處理。
可是 Nginx 因為效能上的考量不給這樣子做,得採自行建立 Virtual Host 的方式才行。

Nginx 主要的設定檔路徑為:
/etc/nginx/nginx.conf
Web Station 會把所有 Virtual Host 資料也寫在這個檔案裡面。

避免之後加了其他 Host 而覆寫了這個檔案,就把 Virtual Host 的資訊拆開來寫。
參照 /etc/nginx/nginx.conf 的內容,最下面有幾個 include 可以使用。

include conf.d/http.*.conf;
include app.d/server.*.conf;
include sites-enabled/*;

* sites-enabled 下面可以任意命名,放這裡比較方便。

一開始搜尋一些網路範例,不是得到 502,要不就 redirect 到 default server 去。
直接在 UI 畫面上見一個來抄比較快了。

把加入的 Virtual Host 資訊 copy 出來另存在 sites-enabled 目錄下即可。

# 這裡是做 http 強制轉 https。
server {
    listen 80;
    listen [::]:80;
    server_name your.virtual.host;
    return 301 https://your.virtual.host$request_uri;
}

server {

    listen      443 ssl;
    listen      [::]:443 ssl;

    server_name your.virtual.host;

    location ^~ /.well-known/acme-challenge {
        root /var/lib/letsencrypt;
        default_type text/plain;
    }

    root    "/your/virtual/host/public";
    index    index.html  index.htm  index.cgi  index.php  index.php5 ;
    error_page 400 401 402 403 404 405 406 407 408 500 501 502 503 504 505 @error_page;

    location @error_page {
        root /var/packages/WebStation/target/error_page;
        rewrite ^ /$status.html break;
    }

    location ^~ /_webstation_/ {
        alias    /var/packages/WebStation/target/error_page/;
    }

    # php 會不會動就看這裡了
    location ~* \.(php[345]?|phtml)$ {
        fastcgi_pass unix:/run/php-fpm/php-9f1e642a-0d20-4664-8934-c51d34f609de.sock;
        fastcgi_param HOST "your.virtual.host";
        include fastcgi.conf;
    }

    # 這一行要記得加入才能 redirect 所有的 uri
    location / {
                try_files $uri $uri/ /index.php?$query_string;
    }

}

Web Station 建立 Virtual Host 的時候,如果伺服器有提供 HTTPS 的連線,並且在伺服器裡面已經設置好憑證的話,會在設定裡面多了 ssl_ 相關的設定。刪除 Virtual Host 的話憑證的目錄也會一起刪除,如果設定檔是複製過來的,就要注意憑證路徑是否被刪掉了。

我這邊是使用憑證是單檔對應多伺服器,所以直接把 ssl_ 的設定通通拿掉,採用預設的 ssl_ 內容即可。

設置完成後可以先試試看 conf 檔案有沒有問題:
sudo nginx -t

沒問題的話讓就載入 conf 擋了:
sudo nginx -s reload

以上

2018年2月27日 星期二

Laravel 利用 git 發佈到 server 上運行

在本機端修改好的 laravel project 可以利用 git 來發布到其他地方去跑。

本地端的 git project 在 push 到 git server 之後不會有下列檔案和目錄:
1. node_modules/
2. vender/
3. .env

當你是第一次在其他地方 clone 了 project 那要注意幾個地方。
1. 透過 composer install 把需要的東西都裝上。
如果當地沒有 composer 就採用下面的命令裝一下。
使用 curl 指令下載:
curl -sS https://getcomposer.org/installer | php
如果沒有安裝 curl ,也可以用 php 指令下載:
php -r "readfile('https://getcomposer.org/installer');" | php

2. 確認 storage/ 以及 bootstrap/cache/ 這兩個目錄是 http access 可以寫入的,如果沒有設定就會出現 exception 。

3. config/app.php 裡面的 'key' => env('APP_KEY', 'YOUR_APP_KEY') 要記得填上,沒填上也是會出現 exception,網路上有人寫說在本地端產生 .env 然後再用 php artisan key:generate 是比較麻煩的做法,這樣每一次發布到不同的地方都要記得建才行。

這邊如果有了解到怎麼配合 .env 的檔案來區分 production 以及 development 的環境就不會每次都要產生無謂的檔案。

以 APP_NAME 為例:
我在本機開發環境在 .env 裡面設了 APP_NAME="Sammixoft mac",而在 config/app.php 裡面將 'name' => env('APP_NAME', 'Sammixoft'), 做這樣的設定。在名稱上就說明了是在哪個環境做事了。

再執行 php artisan config:cache 將 config 重建即可。

最後如果有使用 database 的話就記得再執行 php artisan migrate。

以上

2018年2月23日 星期五

Laravel 的 api route 使用 csrf 的認證

當前的 app 可以使用的認證 (auth guard) 都描述在:
app/Http/Kernel.php 裡面..

每一個 guard 對應到的認證 php 描述在:$routeMiddleware

第一個 $middleware 裡面描述的是不管哪一種方式認證都會載入的 class

第二個 $middlewareGroups 是有指定到對應的 group 才會載入的。

Laravel 已經做好了 CsrfToken 的認證,所以我們只要知道怎麼加入使用即可。

首先修改:app/Http/Kernel.php
在 $routeMiddleware 增加一項認證方式。
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,

    // your authenticate
    'myapi' => \App\Http\Middleware\ApiAuth::class,
    'csrf' => \App\Http\Middleware\VerifyCsrfToken::class,
];

因為 csrf 的認證也需要用到 session,所以我們選擇在 $middleware 作增加。
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
沒有加入這兩行,會跳出 Session 相關的 exception。

接下來把 route 的 middleware 指向 csrf 就可以做認證了。
//following Which require authentication ................
Route::group(
    [
        'prefix' => 'v1',
        'middleware' => 'csrf'
    ],
    function() {
        Route::get('stock',function(){
            return response([1,2,3,4],200);
        });
        Route::post('stock', 'StockController@fetch')->name('home');
    }
);

這邊要注意一點,內建的 VerifyCsrfToken 預設 GET 是直接 pass,所以如果 GET 也想要做認證的話,要自己 override public function handle($request, Closure $next)。
原始的方式在:
vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
public function handle($request, Closure $next)
{
    if (
        $this->isReading($request) ||
        $this->runningUnitTests() ||
        $this->inExceptArray($request) ||
        $this->tokensMatch($request)
    ) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

/**
 * Determine if the HTTP request uses a ‘read’ verb.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return bool
 */
protected function isReading($request)
{
    return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
}

以上

2018年1月23日 星期二

在 Synology NAS 上使用 Laravel Framework

我的 Synology 環境是跑 2 個版本的 PHP,
而新 5.5 的 Laravel 又要 PHP 7.0 以上才給動,
原本是採用 ssh 進去做設定,使用 php 命令就回應某些元件要 >= 7.0。
使用 php70 命令又說 phar extension 沒有啟動。

後來採用了網路磁碟機的方式來做解決。
我的環境是 mac,安裝了 composer。
連上 NAS 的網路磁碟機之後用命令列執行就可以建立好資料夾。

首先在自己的 mac 裡面下載 Laravel:
composer global require "laravel/installer"


接著在 NAS 的磁碟目錄裡面建一個 project:(這邊我用 composer 直接建立,因為我沒有為下載的 Laravel 設立 path)
composer create-project --prefer-dist laravel/laravel blog


在 Synology 的 Web Station 裡設一個虛擬主機,並把『主目錄』設在 Laravel 建立好的 project 目錄裡的 public 子目錄。另外把 PHP 設為 7.0。


連上設定好的網址,成功的話會看到這個畫面。


架設完成就可以開始進行 framework 的研究囉。

Reference:
https://laravel.com/docs/5.5
https://laravel.tw/docs/5.2