質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

6423閲覧

NginxでPHPを動かしたい。(win10)

HHH-

総合スコア28

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2020/11/14 17:47

NginxでNon Thread-PHPを使いたい。

OS:win10
DB:MariaDB
サーバー:Nginx/PHP
/users/サーバー/php
/users/サーバー/nginx

PHP = システム環境変数
Nginx = ユーザー環境変数

試したこと、

(前回:Non Thread-PHPではなく、Thread-PHPで接続できた)

https://teratail.com/questions/303745
この時、Nginxは使ってない。(PHPを単体で動かしていた)

しかしNginxで動かすには、Thread-PHPではなく
Non Thread-PHPを使わなければならないことを以下のサイトで知り、
https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/14/125116
前回と同じ方法で早速動かしてみた。

イメージ説明
イメージ説明
イメージ説明

なぜか接続できず、めちゃくちゃ文字化けしています。

こんどは
PHPのextensionでセミコロンをあえてつけてみてみると

php

1;extension=pdo_mysql

イメージ説明

↓以下のような結果に。
イメージ説明
文字化けしてない!
しかし、実行結果でのエラーは先ほどと変わりません。↓
イメージ説明

どうやらNginx側でnginx.confの設定が必要らしいです。
https://qiita.com/suke/items/4936809289ffe0dc782b
とりあえずコピペで。実行↓

nginxini

1 2 3# ワーカープロ説を実行するユーザーの指定 4#user nobody; 5 6# ワーカープロセス(クライアントからリクエストを受け付けて処理するnginxの子プロセス)の数 7worker_processes 1; 8 9# プロセスIDを保存するファイルの場所 10#pid logs/nginx.pid; 11 12events { 13 # 1ワーカープロセスあたりの最大コネクション数のあたし 14 worker_connections 1024; 15} 16 17http { 18 #### MIMEタイプの設定 19 include mime.types; #拡張子とMIMEタイプの対応ファイルを読み込む 20 default_type application/octet-stream; #拡張子からMIMEタイプを判断できなかった場合のMIMEタイプ 21 22 #### アクセスログの設定 23 # アクセスログの書式の設定、main形式を下記の形式で指定 24 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 25 '$status $body_bytes_sent "$http_referer" ' 26 '"$http_user_agent" "$http_x_forwarded_for"'; 27 # アクセスログの出力場所や書式の指定、main形式でlogs/access.logに出力する 28 #access_log logs/access.log main; 29 30 #### クライアントへの送信(レスポンス)に関する設定 31 # クライアントへの送信にsendfileシステムコールを使うか 32 sendfile on; 33 # LinuxのTCP_CORKソケットオプションを使用するか 34 #tcp_nopush on; 35 36 # keepaliveのタイムアウト時間の設定、65秒 37 keepalive_timeout 65; 38 39 # クライアントにコンテンツを送信する際に圧縮転送するかどうかの設定 40 #gzip on; 41 42 #### バーチャルサーバーの設定 43 server { 44 #### サーバーの基本設定 45 # リクエストを受け付けるIPアドレスやポート番号を設定 46 listen 80; 47 # バーチャルサーバーのホスト名を設定 48 server_name localhost; 49 # rootドキュメントを指定、windowsでも「\」ではなく「/」でディレクトリ階層を指定 50 root C:/server/htdocs/testProject/public; 51 # indexファイル名を設定、 52 # URLが「/」で終わってるものに対してインデックスとして使われるファイル名の指定 53 index index.php index.html index.htm; #前から順番に適用される 54 55 #### サーバー別のログの設定 56 # アクセスログの出力先と出力形式の設定、main形式で出力 57 access_log logs/access.log main; 58 # エラーログの出力先とロギングレベルの設定、noticeレベルまで出力 59 error_log logs/error.log notice; 60 61 #### エラーページの設定 62 #error_page 404 /404.html; 63 error_page 500 502 503 504 /50x.html; #エラーページのパスを設定 64 location = /50x.html { #「/50x.html」にパスが完全一致、一致したら切り上げ 65 root html; 66 } 67 68 #### PHPの設定 69 # 正規表現、パスが「xxxx.php」や「aaa/xxxx.php」や「abc/xxxx.php/bbbb」などに一致 70 location ~ [^/].php(/|$) { 71 # $fastcgi_path_info の値をキャプチャする正規表現を定義 72 # 一つ目の()が $fastcgi_script_name の値になり、二つ目は $fastcgi_path_info の値になる 73 fastcgi_split_path_info ^(.+?.php)(/.*)$; 74 75 # $document_root ルートディレクトリで設定したパス 76 # $fastcgi_script_name ファイル名のパス 77 # -f はファイルが存在するかの判定 78 # ファイルがなければ404エラーを返す 79 if (!-f $document_root$fastcgi_script_name) { 80 return 404; 81 } 82 83 # phpへアクセスするためのIPアドレスとポートの設定 84 fastcgi_pass 127.0.0.1:9000; 85 # phpでのindexファイル名を設定、 86 # URLが「/」で終わってるものに対してインデックスとして使われるファイル名の指定 87 fastcgi_index index.php; 88 89 #### fastcgi_param に関する設定 90 # 多数のfastcgi_paramsの設定が書いてあるfastcgi_paramsファイルを読み込む 91 include fastcgi_params; 92 # 「HTTP_PROXY」パラメータを空にする、HTTPoxyに関する脆弱性を和らげる 93 fastcgi_param HTTP_PROXY ""; 94 # 「SCRIPT_FILENAME」パラメータはphp-fpmがスクリプト名を決定するための設定 95 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 96 } 97 } 98} 99

進展がありました↓ 「Error:could not find driver」に変わっています

イメージ説明

php.iniの ;extension=pdo_mysqlでセミコロンをはずしてやってみます。
イメージ説明

エラーレスポンスは「Error:could not find driver」同じですが
コマンド側の文字化けがひどいですね、

先ほどNginx.iniただ丸ごとコピペしただけなので
当然ファイルなどの指定ミスでできてない可能性があります。
なので

nginxini

1 #### バーチャルサーバーの設定 2 server { 3 #### サーバーの基本設定 4 # リクエストを受け付けるIPアドレスやポート番号を設定 5 listen 80; 6 # バーチャルサーバーのホスト名を設定 7 server_name localhost; 8 # rootドキュメントを指定、windowsでも「\」ではなく「/」でディレクトリ階層を指定 9 root C:/server/nginx/html; 10# コピペ時の=>C:/server/htdocs/testProject/public; 11# コピペ前の=>root html;

実行結果は変わりませんでした。

質問とはあまり関係ないのですが一体どこで文字化けしているのか、やはり気になりますね。
知っている方がいたら教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/11/14 18:06

php-fpmの設定はどこでしょうか? 文字化けはコマンドプロンプトの表示文字コードを切り替えるか、出力する文字コードをコマンドプロンプトに合わせるかです
yukky1201

2020/11/14 18:55

参考にされたサイトはLinuxなのでWindows10に導入しているサイトを参考にしてみたらいかがでしょうか
HHH-

2020/11/16 18:17

いろいろできていろいろわかりましたwww で結論から申し上げますと、ネット上の情報では 「nginxと組み合わせる際は「Non Thread Safe版」の方が良い(というか必須?)」と書かれています 実際に以下のサイトがその通りです https://qiita.com/taniken5/items/5030c482341b312fd55b https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/14/125116 https://www.wake-mob.jp/2019/06/windows10-nginx-php.html nginx.confファイルも設定した上で 私も同じ方法でThread Safe版ではなく「Non Thread Safe版」をつかってやってみると、 実行>PHP-CGI -b127.0.0.1:9000>ブラウザー表示(phpのphpinfo)までは表示できました。 (ーーーーーーーーーーーーーーーーーーーーー表示はできたのでここまでは↑半分成功です) ですが、次の段階でモジュールを使ったDBへの接続では。 実行>PHP-CGI -b127.0.0.1:9000>ブラウザー表示(php〜MariaDBへの接続)>Error:could not find driverとなり、接続に失敗してしまいます。 もちろんphp.iniの;extension=pdo_mysqlなど、さまざまなextensionを開放しましたが それでもエラーコードで「指定のモジュールが見つからない」と出てくるのです。 モジュールの置き場所を見てみると!!全部揃ってます!!。 なのにモジュールを見つけられないのです。 しかし「Non Thread Safe版」ではなく「Thread Safe版」で同じことをすると、 実行>PHP-CGI -b127.0.0.1:9000>ブラウザー表示127.0.0.1/test.php(php〜MariaDBへの接続)> 接続に成功しました。(モジュールも見つけてくれたんですよね) と、、、簡単に成功してしまいました。 ここで第一に質問したいのは、 NginxでPHPを動かすのには「Non Thread Safe版」が推奨されているのですが。。。 推奨されていない「Thread Safe版」をつかうのは問題ありなのでしょうか。。。 (ぎゃくになぜか正規な手順でやっても 「Non Thread Safe版」で失敗してしまっているのが大きな問題だと思うのですが) 第二に「Thread Safe版」ではモジュールが正常に検出さてたのに対し、「Non Thread Safe版」では検出に失敗したのでしょうか。 成功した詳細は「解決した方法」の欄に書き込んでおきます。
guest

回答2

0

失敗の原因は?

「Non Thread Safe版」でなぜDBに接続できないのか理由はわかりませんが
php.iniでmysqlのモジュールを使えるように(
;セミコロン
)を外したにも関わらず
以下のエラーが出てました。

php_pdo_mysql.dllモジュールが見つかりませんでした。

C:\server\php\extファイルの中を確認してもたしかにあるのに。。。
**「Thread Safe版」**は普通に行けましたね。
原因はここら辺にあると思われるが何かわかる方がいたら教えてください><

投稿2020/11/16 20:35

HHH-

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

Win10環境でNginxを使ってPHPを動かす+DBへの接続。

Nginxを使ってPHPを動かす際は「Non Thread Safe版」が推奨されています。
ですが以下の方法を用いいても、PHPは動いたが、DBへの接続が出来なかった。

ので**「Thread Safe版」**だけど、同じ方法でやってみたらできました。
↓以降詳細↓

OS :win10
DB :MariaDB
server :Nginx
PHP-https://www.php.net/downloads

階層構築形式
C:\server\php\php-cgi.exe
C:\server\nginx\html
MariaDBとPHP-cgiの環境変数は編集済み。

[Ngnixのコンフファイル]
nginx\conf\nginx.conf

[PHPのphp.iniファイル]
php\php.ini

各々ファイルを編集していく。

1)Nginxのコンフファイルを編集

まずは、C:\server\nginx\htmlにphpinfo.phpを作成して
phpinfo.phpの中身をテキストエディタで

php

1<?php 2phpinfo(); 3?>

と書き込み、つぎにNginxのコンフファイルを編集していきます。

以下のサイトを参考に設定
https://www.wake-mob.jp/2019/06/windows10-nginx-php.html

nginx

1 2#user nobody; 3worker_processes 1; 4 5#error_log logs/error.log; 6#error_log logs/error.log notice; 7#error_log logs/error.log info; 8 9pid logs/nginx.pid; 10 11 12events { 13 worker_connections 1024; 14} 15 16 17http { 18 include mime.types; 19 default_type application/octet-stream; 20 21 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 22 # '$status $body_bytes_sent "$http_referer" ' 23 # '"$http_user_agent" "$http_x_forwarded_for"'; 24 25 #access_log logs/access.log main; 26 27 sendfile on; 28 #tcp_nopush on; 29 30 #keepalive_timeout 0; 31 keepalive_timeout 65; 32 33 #gzip on; 34 35 server { 36 listen 80; 37 server_name localhost; 38 39 #charset koi8-r; 40 41 #access_log logs/host.access.log main; 42 43 location / { 44 root html; 45 index index.php index.html index.htm; 46 } 47 48 #error_page 404 /404.html; 49 50 # redirect server error pages to the static page /50x.html 51 # 52 error_page 500 502 503 504 /50x.html; 53 location = /50x.html { 54 root html; 55 } 56 57 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 58 # 59 #location ~ .php$ { 60 # proxy_pass http://127.0.0.1; 61 #} 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 C:/server/nginx/html$fastcgi_script_name; 70 include fastcgi_params; 71 } 72 73 # deny access to .htaccess files, if Apache's document root 74 # concurs with nginx's one 75 # 76 #location ~ /.ht { 77 # deny all; 78 #} 79 } 80 81 82 # another virtual host using mix of IP-, name-, and port-based configuration 83 # 84 #server { 85 # listen 8000; 86 # listen somename:8080; 87 # server_name somename alias another.alias; 88 89 # location / { 90 # root html; 91 # index index.html index.htm; 92 # } 93 #} 94 95 96 # HTTPS server 97 # 98 #server { 99 # listen 443 ssl; 100 # server_name localhost; 101 102 # ssl_certificate cert.pem; 103 # ssl_certificate_key cert.key; 104 105 # ssl_session_cache shared:SSL:1m; 106 # ssl_session_timeout 5m; 107 108 # ssl_ciphers HIGH:!aNULL:!MD5; 109 # ssl_prefer_server_ciphers on; 110 111 # location / { 112 # root html; 113 # index index.html index.htm; 114 # } 115 #} 116 117} 118

↓編集内容↓

(9行目 以降)

「pid」の項目が「#」でコメントアウトされているのでコメントを外し、パスを以下のように修正し保存する。

pid C:/servers/nginx/logs/nginx.pid;

(↓わたしは、、、何もいじらずにコメントアウトを外しただけだがうまく行った。)

pid logs/nginx.pid;

ーーーーーーーーーーーーーーーー
(43行目 以降)
index の指定に、index.php を加える。
これで、デフォルトで nginx が index.php を読みに行く↓

location / { root html; index **index.php** index.html index.htm; }

ーーーーーーーーーーーーーーーー
(65行目 以降)
先ほど制作したphpinfo.phpが置かれている場所はC:\server\nginx\htmlなので、
Nginxコンフファイルでは

location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME **C:/server/nginx/html**$fastcgi_script_name; include fastcgi_params; }

ーーーーーーーーーーーーーーーー

と書き換えてやります。

この時点でNginxをコマンドプロンプトから実行・スタートし、
別のコマンドプロントでPHP-CGI(php-cgi.exe -b 127.0.0.1:9000)を実行して
ブラウザーで[127.0.0.1/phpinfo.php]と検索してみると

イメージ説明
PHPのバージョンや詳細が表示されます。
表示に成功したら、PHPが正常に動いたということになるので半分成功できたも同然です。

次はDBへの接続です、


2)php.iniのファイルを編集
Nginxで動いてるPHPをデータベースに接続するには、まず

C:\server\php\の中にphp.iniが有るか無いかを確認して、無ければ
php.ini-production
php.ini-development
などのファイルがあるはずですので、その二つのうちのどちらか!
今回はphp.ini-developmentをコピー複製し、名前をphp.iniに変更してやります。

名前を変更したら
テキストエディタなどでphp.iniの中身を開き。

だいたい900行目以降にある
;extension=pdo_mysql」という構文を探し出し、セミコロンでコメントアウトされているので
セミコロンを外してやります。

phpini

1extension=pdo_mysql

※ちなみに、いくつかの古い参考サイトでは
「php_mysql.dll や extension=php_mysqli.dll」と書かれた箇所を検索して下さい。
と書いてありますが、現在は;extension=pdo_mysqlに変わっているようです。

あとはC:\server\nginx\htmlのなかにtest.phpファイルを作成し
データベースへ接続する実行文を構成して上書き保存してやります。

php

1<html> 2<head><title>PHP TEST</title></head> 3<body> 4 5<?php 6 7$dsn = 'mysql:dbname=test;host=localhost'; 8$user = 'myname'; 9$password = 'mypass'; 10 11try { $dbh = new PDO($dsn, $user, $password); 12 13 print('<br>'); 14 15 if ($dbh == null){ 16 print('接続に失敗しました。<br>'); 17 }else{ 18 print('接続に成功しました。<br>'); 19 } 20}catch (PDOException $e){ 21 print('Error:'.$e->getMessage()); 22 die(); 23} 24 25$dbh = null; 26 27?> 28 29</body> 30</html>

するともういちど
Nginxをコマンドプロンプトから実行し、
別のコマンドプロントでPHP-CGIを実行して
[127.0.0.1/test.php]でブラウザーを表示すると

接続に成功しました。....

投稿2020/11/16 20:18

編集2020/11/16 20:20
HHH-

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問